Add a PATH_INQ flag, PIM_NO_6_BYTE, which indicates the SIM never wishes to
receive 6 byte commands. Add a check for this flag to da(4) and cd(4) so that they honor it. This is a quick workaround for many devices (especially USB) that require da(4) quirks to operate. The more complete approach is to finish the new transport code which will be aware of the SCSI version a transport implements. MFC after: 1 day
This commit is contained in:
parent
79bbf9b702
commit
1cd634adc1
@ -513,7 +513,8 @@ typedef enum {
|
||||
PIM_SCANHILO = 0x80, /* Bus scans from high ID to low ID */
|
||||
PIM_NOREMOVE = 0x40, /* Removeable devices not included in scan */
|
||||
PIM_NOINITIATOR = 0x20, /* Initiator role not supported. */
|
||||
PIM_NOBUSRESET = 0x10 /* User has disabled initial BUS RESET */
|
||||
PIM_NOBUSRESET = 0x10, /* User has disabled initial BUS RESET */
|
||||
PIM_NO_6_BYTE = 0x08 /* Do not send 6-byte commands */
|
||||
} pi_miscflag;
|
||||
|
||||
#ifdef CAM_NEW_TRAN_CODE
|
||||
|
@ -640,6 +640,7 @@ cdregister(struct cam_periph *periph, void *arg)
|
||||
{
|
||||
struct cd_softc *softc;
|
||||
struct ccb_setasync csa;
|
||||
struct ccb_pathinq cpi;
|
||||
struct ccb_getdev *cgd;
|
||||
char tmpstr[80], tmpstr2[80];
|
||||
caddr_t match;
|
||||
@ -688,6 +689,13 @@ cdregister(struct cam_periph *periph, void *arg)
|
||||
else
|
||||
softc->quirks = CD_Q_NONE;
|
||||
|
||||
/* Check if the SIM does not want 6 byte commands */
|
||||
xpt_setup_ccb(&cpi.ccb_h, periph->path, /*priority*/1);
|
||||
cpi.ccb_h.func_code = XPT_PATH_INQ;
|
||||
xpt_action((union ccb *)&cpi);
|
||||
if (cpi.ccb_h.status == CAM_REQ_CMP && (cpi.hba_misc & PIM_NO_6_BYTE))
|
||||
softc->quirks |= CD_Q_10_BYTE_ONLY;
|
||||
|
||||
snprintf(tmpstr, sizeof(tmpstr), "CAM CD unit %d", periph->unit_number);
|
||||
snprintf(tmpstr2, sizeof(tmpstr2), "%d", periph->unit_number);
|
||||
sysctl_ctx_init(&softc->sysctl_ctx);
|
||||
|
@ -1087,6 +1087,7 @@ daregister(struct cam_periph *periph, void *arg)
|
||||
int s;
|
||||
struct da_softc *softc;
|
||||
struct ccb_setasync csa;
|
||||
struct ccb_pathinq cpi;
|
||||
struct ccb_getdev *cgd;
|
||||
char tmpstr[80], tmpstr2[80];
|
||||
caddr_t match;
|
||||
@ -1134,6 +1135,13 @@ daregister(struct cam_periph *periph, void *arg)
|
||||
else
|
||||
softc->quirks = DA_Q_NONE;
|
||||
|
||||
/* Check if the SIM does not want 6 byte commands */
|
||||
xpt_setup_ccb(&cpi.ccb_h, periph->path, /*priority*/1);
|
||||
cpi.ccb_h.func_code = XPT_PATH_INQ;
|
||||
xpt_action((union ccb *)&cpi);
|
||||
if (cpi.ccb_h.status == CAM_REQ_CMP && (cpi.hba_misc & PIM_NO_6_BYTE))
|
||||
softc->quirks |= DA_Q_NO_6_BYTE;
|
||||
|
||||
snprintf(tmpstr, sizeof(tmpstr), "CAM DA unit %d", periph->unit_number);
|
||||
snprintf(tmpstr2, sizeof(tmpstr2), "%d", periph->unit_number);
|
||||
sysctl_ctx_init(&softc->sysctl_ctx);
|
||||
|
@ -238,7 +238,7 @@ atapi_action(struct cam_sim *sim, union ccb *ccb)
|
||||
cpi->version_num = 1;
|
||||
cpi->hba_inquiry = 0;
|
||||
cpi->target_sprt = 0;
|
||||
cpi->hba_misc = 0;
|
||||
cpi->hba_misc = PIM_NO_6_BYTE;
|
||||
cpi->hba_eng_cnt = 0;
|
||||
bzero(cpi->vuhba_flags, sizeof(cpi->vuhba_flags));
|
||||
cpi->max_target = 1;
|
||||
|
@ -2369,7 +2369,7 @@ END_DEBUG
|
||||
cpi->version_num = 1; /* XXX??? */
|
||||
cpi->hba_inquiry = PI_TAG_ABLE;
|
||||
cpi->target_sprt = 0;
|
||||
cpi->hba_misc = PIM_NOBUSRESET;
|
||||
cpi->hba_misc = PIM_NOBUSRESET | PIM_NO_6_BYTE;
|
||||
cpi->hba_eng_cnt = 0;
|
||||
cpi->max_target = SBP_NUM_TARGETS - 1;
|
||||
cpi->max_lun = SBP_NUM_LUNS - 1;
|
||||
|
@ -2393,7 +2393,7 @@ umass_cam_action(struct cam_sim *sim, union ccb *ccb)
|
||||
cpi->version_num = 1;
|
||||
cpi->hba_inquiry = 0;
|
||||
cpi->target_sprt = 0;
|
||||
cpi->hba_misc = 0;
|
||||
cpi->hba_misc = PIM_NO_6_BYTE;
|
||||
cpi->hba_eng_cnt = 0;
|
||||
cpi->max_target = UMASS_SCSIID_MAX; /* one target */
|
||||
cpi->initiator_id = UMASS_SCSIID_HOST;
|
||||
|
Loading…
Reference in New Issue
Block a user