0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022 #include <scsi/scsi.h>
0023 #include <scsi/scsi_eh.h>
0024 #include <scsi/scsi_dh.h>
0025 #include <linux/workqueue.h>
0026 #include <linux/slab.h>
0027 #include <linux/module.h>
0028
0029 #define RDAC_NAME "rdac"
0030 #define RDAC_RETRY_COUNT 5
0031
0032
0033
0034
0035
0036
0037
0038
0039 #define RDAC_QUIESCENCE_TIME 20
0040
0041
0042
0043 #define RDAC_PAGE_CODE_REDUNDANT_CONTROLLER 0x2c
0044
0045
0046
0047
0048 #define RDAC_MODE_TRANSFER_SPECIFIED_LUNS 0x02
0049
0050
0051
0052
0053 #define RDAC_FORCED_QUIESENCE 0x02
0054
0055 #define RDAC_TIMEOUT (60 * HZ)
0056 #define RDAC_RETRIES 3
0057
0058 struct rdac_mode_6_hdr {
0059 u8 data_len;
0060 u8 medium_type;
0061 u8 device_params;
0062 u8 block_desc_len;
0063 };
0064
0065 struct rdac_mode_10_hdr {
0066 u16 data_len;
0067 u8 medium_type;
0068 u8 device_params;
0069 u16 reserved;
0070 u16 block_desc_len;
0071 };
0072
0073 struct rdac_mode_common {
0074 u8 controller_serial[16];
0075 u8 alt_controller_serial[16];
0076 u8 rdac_mode[2];
0077 u8 alt_rdac_mode[2];
0078 u8 quiescence_timeout;
0079 u8 rdac_options;
0080 };
0081
0082 struct rdac_pg_legacy {
0083 struct rdac_mode_6_hdr hdr;
0084 u8 page_code;
0085 u8 page_len;
0086 struct rdac_mode_common common;
0087 #define MODE6_MAX_LUN 32
0088 u8 lun_table[MODE6_MAX_LUN];
0089 u8 reserved2[32];
0090 u8 reserved3;
0091 u8 reserved4;
0092 };
0093
0094 struct rdac_pg_expanded {
0095 struct rdac_mode_10_hdr hdr;
0096 u8 page_code;
0097 u8 subpage_code;
0098 u8 page_len[2];
0099 struct rdac_mode_common common;
0100 u8 lun_table[256];
0101 u8 reserved3;
0102 u8 reserved4;
0103 };
0104
0105 struct c9_inquiry {
0106 u8 peripheral_info;
0107 u8 page_code;
0108 u8 reserved1;
0109 u8 page_len;
0110 u8 page_id[4];
0111 u8 avte_cvp;
0112 u8 path_prio;
0113 u8 reserved2[38];
0114 };
0115
0116 #define SUBSYS_ID_LEN 16
0117 #define SLOT_ID_LEN 2
0118 #define ARRAY_LABEL_LEN 31
0119
0120 struct c4_inquiry {
0121 u8 peripheral_info;
0122 u8 page_code;
0123 u8 reserved1;
0124 u8 page_len;
0125 u8 page_id[4];
0126 u8 subsys_id[SUBSYS_ID_LEN];
0127 u8 revision[4];
0128 u8 slot_id[SLOT_ID_LEN];
0129 u8 reserved[2];
0130 };
0131
0132 #define UNIQUE_ID_LEN 16
0133 struct c8_inquiry {
0134 u8 peripheral_info;
0135 u8 page_code;
0136 u8 reserved1;
0137 u8 page_len;
0138 u8 page_id[4];
0139 u8 reserved2[3];
0140 u8 vol_uniq_id_len;
0141 u8 vol_uniq_id[16];
0142 u8 vol_user_label_len;
0143 u8 vol_user_label[60];
0144 u8 array_uniq_id_len;
0145 u8 array_unique_id[UNIQUE_ID_LEN];
0146 u8 array_user_label_len;
0147 u8 array_user_label[60];
0148 u8 lun[8];
0149 };
0150
0151 struct rdac_controller {
0152 u8 array_id[UNIQUE_ID_LEN];
0153 int use_ms10;
0154 struct kref kref;
0155 struct list_head node;
0156 union {
0157 struct rdac_pg_legacy legacy;
0158 struct rdac_pg_expanded expanded;
0159 } mode_select;
0160 u8 index;
0161 u8 array_name[ARRAY_LABEL_LEN];
0162 struct Scsi_Host *host;
0163 spinlock_t ms_lock;
0164 int ms_queued;
0165 struct work_struct ms_work;
0166 struct scsi_device *ms_sdev;
0167 struct list_head ms_head;
0168 struct list_head dh_list;
0169 };
0170
0171 struct c2_inquiry {
0172 u8 peripheral_info;
0173 u8 page_code;
0174 u8 reserved1;
0175 u8 page_len;
0176 u8 page_id[4];
0177 u8 sw_version[3];
0178 u8 sw_date[3];
0179 u8 features_enabled;
0180 u8 max_lun_supported;
0181 u8 partitions[239];
0182 };
0183
0184 struct rdac_dh_data {
0185 struct list_head node;
0186 struct rdac_controller *ctlr;
0187 struct scsi_device *sdev;
0188 #define UNINITIALIZED_LUN (1 << 8)
0189 unsigned lun;
0190
0191 #define RDAC_MODE 0
0192 #define RDAC_MODE_AVT 1
0193 #define RDAC_MODE_IOSHIP 2
0194 unsigned char mode;
0195
0196 #define RDAC_STATE_ACTIVE 0
0197 #define RDAC_STATE_PASSIVE 1
0198 unsigned char state;
0199
0200 #define RDAC_LUN_UNOWNED 0
0201 #define RDAC_LUN_OWNED 1
0202 char lun_state;
0203
0204 #define RDAC_PREFERRED 0
0205 #define RDAC_NON_PREFERRED 1
0206 char preferred;
0207
0208 union {
0209 struct c2_inquiry c2;
0210 struct c4_inquiry c4;
0211 struct c8_inquiry c8;
0212 struct c9_inquiry c9;
0213 } inq;
0214 };
0215
0216 static const char *mode[] = {
0217 "RDAC",
0218 "AVT",
0219 "IOSHIP",
0220 };
0221 static const char *lun_state[] =
0222 {
0223 "unowned",
0224 "owned",
0225 };
0226
0227 struct rdac_queue_data {
0228 struct list_head entry;
0229 struct rdac_dh_data *h;
0230 activate_complete callback_fn;
0231 void *callback_data;
0232 };
0233
0234 static LIST_HEAD(ctlr_list);
0235 static DEFINE_SPINLOCK(list_lock);
0236 static struct workqueue_struct *kmpath_rdacd;
0237 static void send_mode_select(struct work_struct *work);
0238
0239
0240
0241
0242
0243
0244 static int rdac_logging = 1;
0245 module_param(rdac_logging, int, S_IRUGO|S_IWUSR);
0246 MODULE_PARM_DESC(rdac_logging, "A bit mask of rdac logging levels, "
0247 "Default is 1 - failover logging enabled, "
0248 "set it to 0xF to enable all the logs");
0249
0250 #define RDAC_LOG_FAILOVER 0
0251 #define RDAC_LOG_SENSE 2
0252
0253 #define RDAC_LOG_BITS 2
0254
0255 #define RDAC_LOG_LEVEL(SHIFT) \
0256 ((rdac_logging >> (SHIFT)) & ((1 << (RDAC_LOG_BITS)) - 1))
0257
0258 #define RDAC_LOG(SHIFT, sdev, f, arg...) \
0259 do { \
0260 if (unlikely(RDAC_LOG_LEVEL(SHIFT))) \
0261 sdev_printk(KERN_INFO, sdev, RDAC_NAME ": " f "\n", ## arg); \
0262 } while (0);
0263
0264 static unsigned int rdac_failover_get(struct rdac_controller *ctlr,
0265 struct list_head *list,
0266 unsigned char *cdb)
0267 {
0268 struct rdac_mode_common *common;
0269 unsigned data_size;
0270 struct rdac_queue_data *qdata;
0271 u8 *lun_table;
0272
0273 if (ctlr->use_ms10) {
0274 struct rdac_pg_expanded *rdac_pg;
0275
0276 data_size = sizeof(struct rdac_pg_expanded);
0277 rdac_pg = &ctlr->mode_select.expanded;
0278 memset(rdac_pg, 0, data_size);
0279 common = &rdac_pg->common;
0280 rdac_pg->page_code = RDAC_PAGE_CODE_REDUNDANT_CONTROLLER + 0x40;
0281 rdac_pg->subpage_code = 0x1;
0282 rdac_pg->page_len[0] = 0x01;
0283 rdac_pg->page_len[1] = 0x28;
0284 lun_table = rdac_pg->lun_table;
0285 } else {
0286 struct rdac_pg_legacy *rdac_pg;
0287
0288 data_size = sizeof(struct rdac_pg_legacy);
0289 rdac_pg = &ctlr->mode_select.legacy;
0290 memset(rdac_pg, 0, data_size);
0291 common = &rdac_pg->common;
0292 rdac_pg->page_code = RDAC_PAGE_CODE_REDUNDANT_CONTROLLER;
0293 rdac_pg->page_len = 0x68;
0294 lun_table = rdac_pg->lun_table;
0295 }
0296 common->rdac_mode[1] = RDAC_MODE_TRANSFER_SPECIFIED_LUNS;
0297 common->quiescence_timeout = RDAC_QUIESCENCE_TIME;
0298 common->rdac_options = RDAC_FORCED_QUIESENCE;
0299
0300 list_for_each_entry(qdata, list, entry) {
0301 lun_table[qdata->h->lun] = 0x81;
0302 }
0303
0304
0305 if (ctlr->use_ms10) {
0306 cdb[0] = MODE_SELECT_10;
0307 cdb[7] = data_size >> 8;
0308 cdb[8] = data_size & 0xff;
0309 } else {
0310 cdb[0] = MODE_SELECT;
0311 cdb[4] = data_size;
0312 }
0313
0314 return data_size;
0315 }
0316
0317 static void release_controller(struct kref *kref)
0318 {
0319 struct rdac_controller *ctlr;
0320 ctlr = container_of(kref, struct rdac_controller, kref);
0321
0322 list_del(&ctlr->node);
0323 kfree(ctlr);
0324 }
0325
0326 static struct rdac_controller *get_controller(int index, char *array_name,
0327 u8 *array_id, struct scsi_device *sdev)
0328 {
0329 struct rdac_controller *ctlr, *tmp;
0330
0331 list_for_each_entry(tmp, &ctlr_list, node) {
0332 if ((memcmp(tmp->array_id, array_id, UNIQUE_ID_LEN) == 0) &&
0333 (tmp->index == index) &&
0334 (tmp->host == sdev->host)) {
0335 kref_get(&tmp->kref);
0336 return tmp;
0337 }
0338 }
0339 ctlr = kmalloc(sizeof(*ctlr), GFP_ATOMIC);
0340 if (!ctlr)
0341 return NULL;
0342
0343
0344 memcpy(ctlr->array_id, array_id, UNIQUE_ID_LEN);
0345 ctlr->index = index;
0346 ctlr->host = sdev->host;
0347 memcpy(ctlr->array_name, array_name, ARRAY_LABEL_LEN);
0348
0349 kref_init(&ctlr->kref);
0350 ctlr->use_ms10 = -1;
0351 ctlr->ms_queued = 0;
0352 ctlr->ms_sdev = NULL;
0353 spin_lock_init(&ctlr->ms_lock);
0354 INIT_WORK(&ctlr->ms_work, send_mode_select);
0355 INIT_LIST_HEAD(&ctlr->ms_head);
0356 list_add(&ctlr->node, &ctlr_list);
0357 INIT_LIST_HEAD(&ctlr->dh_list);
0358
0359 return ctlr;
0360 }
0361
0362 static int get_lun_info(struct scsi_device *sdev, struct rdac_dh_data *h,
0363 char *array_name, u8 *array_id)
0364 {
0365 int err = SCSI_DH_IO, i;
0366 struct c8_inquiry *inqp = &h->inq.c8;
0367
0368 if (!scsi_get_vpd_page(sdev, 0xC8, (unsigned char *)inqp,
0369 sizeof(struct c8_inquiry))) {
0370 if (inqp->page_code != 0xc8)
0371 return SCSI_DH_NOSYS;
0372 if (inqp->page_id[0] != 'e' || inqp->page_id[1] != 'd' ||
0373 inqp->page_id[2] != 'i' || inqp->page_id[3] != 'd')
0374 return SCSI_DH_NOSYS;
0375 h->lun = inqp->lun[7];
0376
0377 for(i=0; i<ARRAY_LABEL_LEN-1; ++i)
0378 *(array_name+i) = inqp->array_user_label[(2*i)+1];
0379
0380 *(array_name+ARRAY_LABEL_LEN-1) = '\0';
0381 memset(array_id, 0, UNIQUE_ID_LEN);
0382 memcpy(array_id, inqp->array_unique_id, inqp->array_uniq_id_len);
0383 err = SCSI_DH_OK;
0384 }
0385 return err;
0386 }
0387
0388 static int check_ownership(struct scsi_device *sdev, struct rdac_dh_data *h)
0389 {
0390 int err = SCSI_DH_IO, access_state;
0391 struct rdac_dh_data *tmp;
0392 struct c9_inquiry *inqp = &h->inq.c9;
0393
0394 h->state = RDAC_STATE_ACTIVE;
0395 if (!scsi_get_vpd_page(sdev, 0xC9, (unsigned char *)inqp,
0396 sizeof(struct c9_inquiry))) {
0397
0398 if ((inqp->avte_cvp >> 5) & 0x1)
0399 h->mode = RDAC_MODE_IOSHIP;
0400 else if (inqp->avte_cvp >> 7)
0401 h->mode = RDAC_MODE_AVT;
0402 else
0403 h->mode = RDAC_MODE;
0404
0405
0406 if (inqp->avte_cvp & 0x1) {
0407 h->lun_state = RDAC_LUN_OWNED;
0408 access_state = SCSI_ACCESS_STATE_OPTIMAL;
0409 } else {
0410 h->lun_state = RDAC_LUN_UNOWNED;
0411 if (h->mode == RDAC_MODE) {
0412 h->state = RDAC_STATE_PASSIVE;
0413 access_state = SCSI_ACCESS_STATE_STANDBY;
0414 } else
0415 access_state = SCSI_ACCESS_STATE_ACTIVE;
0416 }
0417
0418
0419 if (inqp->path_prio & 0x1) {
0420 h->preferred = RDAC_PREFERRED;
0421 access_state |= SCSI_ACCESS_STATE_PREFERRED;
0422 } else
0423 h->preferred = RDAC_NON_PREFERRED;
0424 rcu_read_lock();
0425 list_for_each_entry_rcu(tmp, &h->ctlr->dh_list, node) {
0426
0427 BUG_ON(!tmp->sdev);
0428 tmp->sdev->access_state = access_state;
0429 }
0430 rcu_read_unlock();
0431 err = SCSI_DH_OK;
0432 }
0433
0434 return err;
0435 }
0436
0437 static int initialize_controller(struct scsi_device *sdev,
0438 struct rdac_dh_data *h, char *array_name, u8 *array_id)
0439 {
0440 int err = SCSI_DH_IO, index;
0441 struct c4_inquiry *inqp = &h->inq.c4;
0442
0443 if (!scsi_get_vpd_page(sdev, 0xC4, (unsigned char *)inqp,
0444 sizeof(struct c4_inquiry))) {
0445
0446 if (inqp->slot_id[1] == 0x31)
0447 index = 0;
0448 else
0449 index = 1;
0450
0451 spin_lock(&list_lock);
0452 h->ctlr = get_controller(index, array_name, array_id, sdev);
0453 if (!h->ctlr)
0454 err = SCSI_DH_RES_TEMP_UNAVAIL;
0455 else {
0456 h->sdev = sdev;
0457 list_add_rcu(&h->node, &h->ctlr->dh_list);
0458 }
0459 spin_unlock(&list_lock);
0460 err = SCSI_DH_OK;
0461 }
0462 return err;
0463 }
0464
0465 static int set_mode_select(struct scsi_device *sdev, struct rdac_dh_data *h)
0466 {
0467 int err = SCSI_DH_IO;
0468 struct c2_inquiry *inqp = &h->inq.c2;
0469
0470 if (!scsi_get_vpd_page(sdev, 0xC2, (unsigned char *)inqp,
0471 sizeof(struct c2_inquiry))) {
0472
0473
0474
0475
0476 if (inqp->max_lun_supported >= MODE6_MAX_LUN)
0477 h->ctlr->use_ms10 = 1;
0478 else
0479 h->ctlr->use_ms10 = 0;
0480 err = SCSI_DH_OK;
0481 }
0482 return err;
0483 }
0484
0485 static int mode_select_handle_sense(struct scsi_device *sdev,
0486 struct scsi_sense_hdr *sense_hdr)
0487 {
0488 int err = SCSI_DH_IO;
0489 struct rdac_dh_data *h = sdev->handler_data;
0490
0491 if (!scsi_sense_valid(sense_hdr))
0492 goto done;
0493
0494 switch (sense_hdr->sense_key) {
0495 case NO_SENSE:
0496 case ABORTED_COMMAND:
0497 case UNIT_ATTENTION:
0498 err = SCSI_DH_RETRY;
0499 break;
0500 case NOT_READY:
0501 if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x01)
0502
0503
0504
0505 err = SCSI_DH_RETRY;
0506 break;
0507 case ILLEGAL_REQUEST:
0508 if (sense_hdr->asc == 0x91 && sense_hdr->ascq == 0x36)
0509
0510
0511
0512 err = SCSI_DH_IMM_RETRY;
0513 break;
0514 default:
0515 break;
0516 }
0517
0518 RDAC_LOG(RDAC_LOG_FAILOVER, sdev, "array %s, ctlr %d, "
0519 "MODE_SELECT returned with sense %02x/%02x/%02x",
0520 (char *) h->ctlr->array_name, h->ctlr->index,
0521 sense_hdr->sense_key, sense_hdr->asc, sense_hdr->ascq);
0522
0523 done:
0524 return err;
0525 }
0526
0527 static void send_mode_select(struct work_struct *work)
0528 {
0529 struct rdac_controller *ctlr =
0530 container_of(work, struct rdac_controller, ms_work);
0531 struct scsi_device *sdev = ctlr->ms_sdev;
0532 struct rdac_dh_data *h = sdev->handler_data;
0533 int err = SCSI_DH_OK, retry_cnt = RDAC_RETRY_COUNT;
0534 struct rdac_queue_data *tmp, *qdata;
0535 LIST_HEAD(list);
0536 unsigned char cdb[MAX_COMMAND_SIZE];
0537 struct scsi_sense_hdr sshdr;
0538 unsigned int data_size;
0539 blk_opf_t req_flags = REQ_FAILFAST_DEV | REQ_FAILFAST_TRANSPORT |
0540 REQ_FAILFAST_DRIVER;
0541
0542 spin_lock(&ctlr->ms_lock);
0543 list_splice_init(&ctlr->ms_head, &list);
0544 ctlr->ms_queued = 0;
0545 ctlr->ms_sdev = NULL;
0546 spin_unlock(&ctlr->ms_lock);
0547
0548 retry:
0549 memset(cdb, 0, sizeof(cdb));
0550
0551 data_size = rdac_failover_get(ctlr, &list, cdb);
0552
0553 RDAC_LOG(RDAC_LOG_FAILOVER, sdev, "array %s, ctlr %d, "
0554 "%s MODE_SELECT command",
0555 (char *) h->ctlr->array_name, h->ctlr->index,
0556 (retry_cnt == RDAC_RETRY_COUNT) ? "queueing" : "retrying");
0557
0558 if (scsi_execute(sdev, cdb, DMA_TO_DEVICE, &h->ctlr->mode_select,
0559 data_size, NULL, &sshdr, RDAC_TIMEOUT * HZ,
0560 RDAC_RETRIES, req_flags, 0, NULL)) {
0561 err = mode_select_handle_sense(sdev, &sshdr);
0562 if (err == SCSI_DH_RETRY && retry_cnt--)
0563 goto retry;
0564 if (err == SCSI_DH_IMM_RETRY)
0565 goto retry;
0566 }
0567 if (err == SCSI_DH_OK) {
0568 h->state = RDAC_STATE_ACTIVE;
0569 RDAC_LOG(RDAC_LOG_FAILOVER, sdev, "array %s, ctlr %d, "
0570 "MODE_SELECT completed",
0571 (char *) h->ctlr->array_name, h->ctlr->index);
0572 }
0573
0574 list_for_each_entry_safe(qdata, tmp, &list, entry) {
0575 list_del(&qdata->entry);
0576 if (err == SCSI_DH_OK)
0577 qdata->h->state = RDAC_STATE_ACTIVE;
0578 if (qdata->callback_fn)
0579 qdata->callback_fn(qdata->callback_data, err);
0580 kfree(qdata);
0581 }
0582 return;
0583 }
0584
0585 static int queue_mode_select(struct scsi_device *sdev,
0586 activate_complete fn, void *data)
0587 {
0588 struct rdac_queue_data *qdata;
0589 struct rdac_controller *ctlr;
0590
0591 qdata = kzalloc(sizeof(*qdata), GFP_KERNEL);
0592 if (!qdata)
0593 return SCSI_DH_RETRY;
0594
0595 qdata->h = sdev->handler_data;
0596 qdata->callback_fn = fn;
0597 qdata->callback_data = data;
0598
0599 ctlr = qdata->h->ctlr;
0600 spin_lock(&ctlr->ms_lock);
0601 list_add_tail(&qdata->entry, &ctlr->ms_head);
0602 if (!ctlr->ms_queued) {
0603 ctlr->ms_queued = 1;
0604 ctlr->ms_sdev = sdev;
0605 queue_work(kmpath_rdacd, &ctlr->ms_work);
0606 }
0607 spin_unlock(&ctlr->ms_lock);
0608 return SCSI_DH_OK;
0609 }
0610
0611 static int rdac_activate(struct scsi_device *sdev,
0612 activate_complete fn, void *data)
0613 {
0614 struct rdac_dh_data *h = sdev->handler_data;
0615 int err = SCSI_DH_OK;
0616 int act = 0;
0617
0618 err = check_ownership(sdev, h);
0619 if (err != SCSI_DH_OK)
0620 goto done;
0621
0622 switch (h->mode) {
0623 case RDAC_MODE:
0624 if (h->lun_state == RDAC_LUN_UNOWNED)
0625 act = 1;
0626 break;
0627 case RDAC_MODE_IOSHIP:
0628 if ((h->lun_state == RDAC_LUN_UNOWNED) &&
0629 (h->preferred == RDAC_PREFERRED))
0630 act = 1;
0631 break;
0632 default:
0633 break;
0634 }
0635
0636 if (act) {
0637 err = queue_mode_select(sdev, fn, data);
0638 if (err == SCSI_DH_OK)
0639 return 0;
0640 }
0641 done:
0642 if (fn)
0643 fn(data, err);
0644 return 0;
0645 }
0646
0647 static blk_status_t rdac_prep_fn(struct scsi_device *sdev, struct request *req)
0648 {
0649 struct rdac_dh_data *h = sdev->handler_data;
0650
0651 if (h->state != RDAC_STATE_ACTIVE) {
0652 req->rq_flags |= RQF_QUIET;
0653 return BLK_STS_IOERR;
0654 }
0655
0656 return BLK_STS_OK;
0657 }
0658
0659 static enum scsi_disposition rdac_check_sense(struct scsi_device *sdev,
0660 struct scsi_sense_hdr *sense_hdr)
0661 {
0662 struct rdac_dh_data *h = sdev->handler_data;
0663
0664 RDAC_LOG(RDAC_LOG_SENSE, sdev, "array %s, ctlr %d, "
0665 "I/O returned with sense %02x/%02x/%02x",
0666 (char *) h->ctlr->array_name, h->ctlr->index,
0667 sense_hdr->sense_key, sense_hdr->asc, sense_hdr->ascq);
0668
0669 switch (sense_hdr->sense_key) {
0670 case NOT_READY:
0671 if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x01)
0672
0673
0674
0675
0676 return ADD_TO_MLQUEUE;
0677 if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0x81)
0678
0679
0680
0681
0682
0683 return SUCCESS;
0684 if (sense_hdr->asc == 0x04 && sense_hdr->ascq == 0xA1)
0685
0686
0687
0688
0689 return ADD_TO_MLQUEUE;
0690 if (sense_hdr->asc == 0xA1 && sense_hdr->ascq == 0x02)
0691
0692
0693
0694
0695 return ADD_TO_MLQUEUE;
0696 break;
0697 case ILLEGAL_REQUEST:
0698 if (sense_hdr->asc == 0x94 && sense_hdr->ascq == 0x01) {
0699
0700
0701
0702
0703 h->state = RDAC_STATE_PASSIVE;
0704 return SUCCESS;
0705 }
0706 break;
0707 case UNIT_ATTENTION:
0708 if (sense_hdr->asc == 0x29 && sense_hdr->ascq == 0x00)
0709
0710
0711
0712 return ADD_TO_MLQUEUE;
0713 if (sense_hdr->asc == 0x8b && sense_hdr->ascq == 0x02)
0714
0715
0716
0717 return ADD_TO_MLQUEUE;
0718 break;
0719 }
0720
0721 return SCSI_RETURN_NOT_HANDLED;
0722 }
0723
0724 static int rdac_bus_attach(struct scsi_device *sdev)
0725 {
0726 struct rdac_dh_data *h;
0727 int err;
0728 char array_name[ARRAY_LABEL_LEN];
0729 char array_id[UNIQUE_ID_LEN];
0730
0731 h = kzalloc(sizeof(*h) , GFP_KERNEL);
0732 if (!h)
0733 return SCSI_DH_NOMEM;
0734 h->lun = UNINITIALIZED_LUN;
0735 h->state = RDAC_STATE_ACTIVE;
0736
0737 err = get_lun_info(sdev, h, array_name, array_id);
0738 if (err != SCSI_DH_OK)
0739 goto failed;
0740
0741 err = initialize_controller(sdev, h, array_name, array_id);
0742 if (err != SCSI_DH_OK)
0743 goto failed;
0744
0745 err = check_ownership(sdev, h);
0746 if (err != SCSI_DH_OK)
0747 goto clean_ctlr;
0748
0749 err = set_mode_select(sdev, h);
0750 if (err != SCSI_DH_OK)
0751 goto clean_ctlr;
0752
0753 sdev_printk(KERN_NOTICE, sdev,
0754 "%s: LUN %d (%s) (%s)\n",
0755 RDAC_NAME, h->lun, mode[(int)h->mode],
0756 lun_state[(int)h->lun_state]);
0757
0758 sdev->handler_data = h;
0759 return SCSI_DH_OK;
0760
0761 clean_ctlr:
0762 spin_lock(&list_lock);
0763 kref_put(&h->ctlr->kref, release_controller);
0764 spin_unlock(&list_lock);
0765
0766 failed:
0767 kfree(h);
0768 return err;
0769 }
0770
0771 static void rdac_bus_detach( struct scsi_device *sdev )
0772 {
0773 struct rdac_dh_data *h = sdev->handler_data;
0774
0775 if (h->ctlr && h->ctlr->ms_queued)
0776 flush_workqueue(kmpath_rdacd);
0777
0778 spin_lock(&list_lock);
0779 if (h->ctlr) {
0780 list_del_rcu(&h->node);
0781 kref_put(&h->ctlr->kref, release_controller);
0782 }
0783 spin_unlock(&list_lock);
0784 sdev->handler_data = NULL;
0785 synchronize_rcu();
0786 kfree(h);
0787 }
0788
0789 static struct scsi_device_handler rdac_dh = {
0790 .name = RDAC_NAME,
0791 .module = THIS_MODULE,
0792 .prep_fn = rdac_prep_fn,
0793 .check_sense = rdac_check_sense,
0794 .attach = rdac_bus_attach,
0795 .detach = rdac_bus_detach,
0796 .activate = rdac_activate,
0797 };
0798
0799 static int __init rdac_init(void)
0800 {
0801 int r;
0802
0803 r = scsi_register_device_handler(&rdac_dh);
0804 if (r != 0) {
0805 printk(KERN_ERR "Failed to register scsi device handler.");
0806 goto done;
0807 }
0808
0809
0810
0811
0812 kmpath_rdacd = create_singlethread_workqueue("kmpath_rdacd");
0813 if (!kmpath_rdacd) {
0814 scsi_unregister_device_handler(&rdac_dh);
0815 printk(KERN_ERR "kmpath_rdacd creation failed.\n");
0816
0817 r = -EINVAL;
0818 }
0819 done:
0820 return r;
0821 }
0822
0823 static void __exit rdac_exit(void)
0824 {
0825 destroy_workqueue(kmpath_rdacd);
0826 scsi_unregister_device_handler(&rdac_dh);
0827 }
0828
0829 module_init(rdac_init);
0830 module_exit(rdac_exit);
0831
0832 MODULE_DESCRIPTION("Multipath LSI/Engenio/NetApp E-Series RDAC driver");
0833 MODULE_AUTHOR("Mike Christie, Chandra Seetharaman");
0834 MODULE_VERSION("01.00.0000.0000");
0835 MODULE_LICENSE("GPL");