static int send_trespass_cmd(struct scsi_device *sdev, struct clariion_dh_data *csdev) { struct request *rq; unsigned char *page22; int err, len, cmd; if (csdev->flags & CLARIION_SHORT_TRESPASS) { page22 = short_trespass; if (!(csdev->flags & CLARIION_HONOR_RESERVATIONS)) /* Set Honor Reservations bit */ page22[6] |= 0x80; len = sizeof(short_trespass); cmd = MODE_SELECT; } else { page22 = long_trespass; if (!(csdev->flags & CLARIION_HONOR_RESERVATIONS)) /* Set Honor Reservations bit */ page22[10] |= 0x80; len = sizeof(long_trespass); cmd = MODE_SELECT_10; } BUG_ON((len > CLARIION_BUFFER_SIZE)); memcpy(csdev->buffer, page22, len); rq = get_req(sdev, cmd, csdev->buffer); if (!rq) return SCSI_DH_RES_TEMP_UNAVAIL; rq->sense = csdev->sense; memset(rq->sense, 0, SCSI_SENSE_BUFFERSIZE); rq->sense_len = csdev->senselen = 0; err = blk_execute_rq(sdev->request_queue, NULL, rq, 1); if (err == -EIO) { if (rq->sense_len) { err = trespass_endio(sdev, csdev->sense); } else { sdev_printk(KERN_INFO, sdev, "%s: failed to send MODE SELECT: %x\n", CLARIION_NAME, rq->errors); } } blk_put_request(rq); return err; }
static int clariion_activate(struct scsi_device *sdev) { int result, done = 0; result = send_cmd(sdev, INQUIRY); result = sp_info_endio(sdev, result, 0, &done); if (result || done) goto done; result = send_cmd(sdev, MODE_SELECT); result = trespass_endio(sdev, result); if (result) goto done; result = send_cmd(sdev, INQUIRY); result = sp_info_endio(sdev, result, 1, NULL); done: return result; }