0001
0002
0003
0004
0005
0006
0007
0008 #include <linux/slab.h>
0009 #include <linux/module.h>
0010 #include <linux/kernel.h>
0011 #include <linux/enclosure.h>
0012 #include <asm/unaligned.h>
0013
0014 #include <scsi/scsi.h>
0015 #include <scsi/scsi_cmnd.h>
0016 #include <scsi/scsi_dbg.h>
0017 #include <scsi/scsi_device.h>
0018 #include <scsi/scsi_driver.h>
0019 #include <scsi/scsi_host.h>
0020
0021 #include <scsi/scsi_transport_sas.h>
0022
0023 struct ses_device {
0024 unsigned char *page1;
0025 unsigned char *page1_types;
0026 unsigned char *page2;
0027 unsigned char *page10;
0028 short page1_len;
0029 short page1_num_types;
0030 short page2_len;
0031 short page10_len;
0032 };
0033
0034 struct ses_component {
0035 u64 addr;
0036 };
0037
0038 static bool ses_page2_supported(struct enclosure_device *edev)
0039 {
0040 struct ses_device *ses_dev = edev->scratch;
0041
0042 return (ses_dev->page2 != NULL);
0043 }
0044
0045 static int ses_probe(struct device *dev)
0046 {
0047 struct scsi_device *sdev = to_scsi_device(dev);
0048 int err = -ENODEV;
0049
0050 if (sdev->type != TYPE_ENCLOSURE)
0051 goto out;
0052
0053 err = 0;
0054 sdev_printk(KERN_NOTICE, sdev, "Attached Enclosure device\n");
0055
0056 out:
0057 return err;
0058 }
0059
0060 #define SES_TIMEOUT (30 * HZ)
0061 #define SES_RETRIES 3
0062
0063 static void init_device_slot_control(unsigned char *dest_desc,
0064 struct enclosure_component *ecomp,
0065 unsigned char *status)
0066 {
0067 memcpy(dest_desc, status, 4);
0068 dest_desc[0] = 0;
0069
0070 if (ecomp->type == ENCLOSURE_COMPONENT_DEVICE)
0071 dest_desc[1] = 0;
0072 dest_desc[2] &= 0xde;
0073 dest_desc[3] &= 0x3c;
0074 }
0075
0076
0077 static int ses_recv_diag(struct scsi_device *sdev, int page_code,
0078 void *buf, int bufflen)
0079 {
0080 int ret;
0081 unsigned char cmd[] = {
0082 RECEIVE_DIAGNOSTIC,
0083 1,
0084 page_code,
0085 bufflen >> 8,
0086 bufflen & 0xff,
0087 0
0088 };
0089 unsigned char recv_page_code;
0090 unsigned int retries = SES_RETRIES;
0091 struct scsi_sense_hdr sshdr;
0092
0093 do {
0094 ret = scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, bufflen,
0095 &sshdr, SES_TIMEOUT, 1, NULL);
0096 } while (ret > 0 && --retries && scsi_sense_valid(&sshdr) &&
0097 (sshdr.sense_key == NOT_READY ||
0098 (sshdr.sense_key == UNIT_ATTENTION && sshdr.asc == 0x29)));
0099
0100 if (unlikely(ret))
0101 return ret;
0102
0103 recv_page_code = ((unsigned char *)buf)[0];
0104
0105 if (likely(recv_page_code == page_code))
0106 return ret;
0107
0108
0109
0110
0111 sdev_printk(KERN_ERR, sdev,
0112 "Wrong diagnostic page; asked for %d got %u\n",
0113 page_code, recv_page_code);
0114
0115 return -EINVAL;
0116 }
0117
0118 static int ses_send_diag(struct scsi_device *sdev, int page_code,
0119 void *buf, int bufflen)
0120 {
0121 int result;
0122
0123 unsigned char cmd[] = {
0124 SEND_DIAGNOSTIC,
0125 0x10,
0126 0,
0127 bufflen >> 8,
0128 bufflen & 0xff,
0129 0
0130 };
0131 struct scsi_sense_hdr sshdr;
0132 unsigned int retries = SES_RETRIES;
0133
0134 do {
0135 result = scsi_execute_req(sdev, cmd, DMA_TO_DEVICE, buf, bufflen,
0136 &sshdr, SES_TIMEOUT, 1, NULL);
0137 } while (result > 0 && --retries && scsi_sense_valid(&sshdr) &&
0138 (sshdr.sense_key == NOT_READY ||
0139 (sshdr.sense_key == UNIT_ATTENTION && sshdr.asc == 0x29)));
0140
0141 if (result)
0142 sdev_printk(KERN_ERR, sdev, "SEND DIAGNOSTIC result: %8x\n",
0143 result);
0144 return result;
0145 }
0146
0147 static int ses_set_page2_descriptor(struct enclosure_device *edev,
0148 struct enclosure_component *ecomp,
0149 unsigned char *desc)
0150 {
0151 int i, j, count = 0, descriptor = ecomp->number;
0152 struct scsi_device *sdev = to_scsi_device(edev->edev.parent);
0153 struct ses_device *ses_dev = edev->scratch;
0154 unsigned char *type_ptr = ses_dev->page1_types;
0155 unsigned char *desc_ptr = ses_dev->page2 + 8;
0156
0157
0158 memset(desc_ptr, 0, ses_dev->page2_len - 8);
0159 for (i = 0; i < ses_dev->page1_num_types; i++, type_ptr += 4) {
0160 for (j = 0; j < type_ptr[1]; j++) {
0161 desc_ptr += 4;
0162 if (type_ptr[0] != ENCLOSURE_COMPONENT_DEVICE &&
0163 type_ptr[0] != ENCLOSURE_COMPONENT_ARRAY_DEVICE)
0164 continue;
0165 if (count++ == descriptor) {
0166 memcpy(desc_ptr, desc, 4);
0167
0168 desc_ptr[0] |= 0x80;
0169
0170 desc_ptr[0] &= 0xf0;
0171 }
0172 }
0173 }
0174
0175 return ses_send_diag(sdev, 2, ses_dev->page2, ses_dev->page2_len);
0176 }
0177
0178 static unsigned char *ses_get_page2_descriptor(struct enclosure_device *edev,
0179 struct enclosure_component *ecomp)
0180 {
0181 int i, j, count = 0, descriptor = ecomp->number;
0182 struct scsi_device *sdev = to_scsi_device(edev->edev.parent);
0183 struct ses_device *ses_dev = edev->scratch;
0184 unsigned char *type_ptr = ses_dev->page1_types;
0185 unsigned char *desc_ptr = ses_dev->page2 + 8;
0186
0187 if (ses_recv_diag(sdev, 2, ses_dev->page2, ses_dev->page2_len) < 0)
0188 return NULL;
0189
0190 for (i = 0; i < ses_dev->page1_num_types; i++, type_ptr += 4) {
0191 for (j = 0; j < type_ptr[1]; j++) {
0192 desc_ptr += 4;
0193 if (type_ptr[0] != ENCLOSURE_COMPONENT_DEVICE &&
0194 type_ptr[0] != ENCLOSURE_COMPONENT_ARRAY_DEVICE)
0195 continue;
0196 if (count++ == descriptor)
0197 return desc_ptr;
0198 }
0199 }
0200 return NULL;
0201 }
0202
0203
0204
0205
0206
0207 static void ses_get_fault(struct enclosure_device *edev,
0208 struct enclosure_component *ecomp)
0209 {
0210 unsigned char *desc;
0211
0212 if (!ses_page2_supported(edev)) {
0213 ecomp->fault = 0;
0214 return;
0215 }
0216 desc = ses_get_page2_descriptor(edev, ecomp);
0217 if (desc)
0218 ecomp->fault = (desc[3] & 0x60) >> 4;
0219 }
0220
0221 static int ses_set_fault(struct enclosure_device *edev,
0222 struct enclosure_component *ecomp,
0223 enum enclosure_component_setting val)
0224 {
0225 unsigned char desc[4];
0226 unsigned char *desc_ptr;
0227
0228 if (!ses_page2_supported(edev))
0229 return -EINVAL;
0230
0231 desc_ptr = ses_get_page2_descriptor(edev, ecomp);
0232
0233 if (!desc_ptr)
0234 return -EIO;
0235
0236 init_device_slot_control(desc, ecomp, desc_ptr);
0237
0238 switch (val) {
0239 case ENCLOSURE_SETTING_DISABLED:
0240 desc[3] &= 0xdf;
0241 break;
0242 case ENCLOSURE_SETTING_ENABLED:
0243 desc[3] |= 0x20;
0244 break;
0245 default:
0246
0247 return -EINVAL;
0248 }
0249
0250 return ses_set_page2_descriptor(edev, ecomp, desc);
0251 }
0252
0253 static void ses_get_status(struct enclosure_device *edev,
0254 struct enclosure_component *ecomp)
0255 {
0256 unsigned char *desc;
0257
0258 if (!ses_page2_supported(edev)) {
0259 ecomp->status = 0;
0260 return;
0261 }
0262 desc = ses_get_page2_descriptor(edev, ecomp);
0263 if (desc)
0264 ecomp->status = (desc[0] & 0x0f);
0265 }
0266
0267 static void ses_get_locate(struct enclosure_device *edev,
0268 struct enclosure_component *ecomp)
0269 {
0270 unsigned char *desc;
0271
0272 if (!ses_page2_supported(edev)) {
0273 ecomp->locate = 0;
0274 return;
0275 }
0276 desc = ses_get_page2_descriptor(edev, ecomp);
0277 if (desc)
0278 ecomp->locate = (desc[2] & 0x02) ? 1 : 0;
0279 }
0280
0281 static int ses_set_locate(struct enclosure_device *edev,
0282 struct enclosure_component *ecomp,
0283 enum enclosure_component_setting val)
0284 {
0285 unsigned char desc[4];
0286 unsigned char *desc_ptr;
0287
0288 if (!ses_page2_supported(edev))
0289 return -EINVAL;
0290
0291 desc_ptr = ses_get_page2_descriptor(edev, ecomp);
0292
0293 if (!desc_ptr)
0294 return -EIO;
0295
0296 init_device_slot_control(desc, ecomp, desc_ptr);
0297
0298 switch (val) {
0299 case ENCLOSURE_SETTING_DISABLED:
0300 desc[2] &= 0xfd;
0301 break;
0302 case ENCLOSURE_SETTING_ENABLED:
0303 desc[2] |= 0x02;
0304 break;
0305 default:
0306
0307 return -EINVAL;
0308 }
0309 return ses_set_page2_descriptor(edev, ecomp, desc);
0310 }
0311
0312 static int ses_set_active(struct enclosure_device *edev,
0313 struct enclosure_component *ecomp,
0314 enum enclosure_component_setting val)
0315 {
0316 unsigned char desc[4];
0317 unsigned char *desc_ptr;
0318
0319 if (!ses_page2_supported(edev))
0320 return -EINVAL;
0321
0322 desc_ptr = ses_get_page2_descriptor(edev, ecomp);
0323
0324 if (!desc_ptr)
0325 return -EIO;
0326
0327 init_device_slot_control(desc, ecomp, desc_ptr);
0328
0329 switch (val) {
0330 case ENCLOSURE_SETTING_DISABLED:
0331 desc[2] &= 0x7f;
0332 ecomp->active = 0;
0333 break;
0334 case ENCLOSURE_SETTING_ENABLED:
0335 desc[2] |= 0x80;
0336 ecomp->active = 1;
0337 break;
0338 default:
0339
0340 return -EINVAL;
0341 }
0342 return ses_set_page2_descriptor(edev, ecomp, desc);
0343 }
0344
0345 static int ses_show_id(struct enclosure_device *edev, char *buf)
0346 {
0347 struct ses_device *ses_dev = edev->scratch;
0348 unsigned long long id = get_unaligned_be64(ses_dev->page1+8+4);
0349
0350 return sprintf(buf, "%#llx\n", id);
0351 }
0352
0353 static void ses_get_power_status(struct enclosure_device *edev,
0354 struct enclosure_component *ecomp)
0355 {
0356 unsigned char *desc;
0357
0358 if (!ses_page2_supported(edev)) {
0359 ecomp->power_status = 0;
0360 return;
0361 }
0362
0363 desc = ses_get_page2_descriptor(edev, ecomp);
0364 if (desc)
0365 ecomp->power_status = (desc[3] & 0x10) ? 0 : 1;
0366 }
0367
0368 static int ses_set_power_status(struct enclosure_device *edev,
0369 struct enclosure_component *ecomp,
0370 int val)
0371 {
0372 unsigned char desc[4];
0373 unsigned char *desc_ptr;
0374
0375 if (!ses_page2_supported(edev))
0376 return -EINVAL;
0377
0378 desc_ptr = ses_get_page2_descriptor(edev, ecomp);
0379
0380 if (!desc_ptr)
0381 return -EIO;
0382
0383 init_device_slot_control(desc, ecomp, desc_ptr);
0384
0385 switch (val) {
0386
0387 case 0:
0388 desc[3] |= 0x10;
0389 break;
0390 case 1:
0391 desc[3] &= 0xef;
0392 break;
0393 default:
0394 return -EINVAL;
0395 }
0396 ecomp->power_status = val;
0397 return ses_set_page2_descriptor(edev, ecomp, desc);
0398 }
0399
0400 static struct enclosure_component_callbacks ses_enclosure_callbacks = {
0401 .get_fault = ses_get_fault,
0402 .set_fault = ses_set_fault,
0403 .get_status = ses_get_status,
0404 .get_locate = ses_get_locate,
0405 .set_locate = ses_set_locate,
0406 .get_power_status = ses_get_power_status,
0407 .set_power_status = ses_set_power_status,
0408 .set_active = ses_set_active,
0409 .show_id = ses_show_id,
0410 };
0411
0412 struct ses_host_edev {
0413 struct Scsi_Host *shost;
0414 struct enclosure_device *edev;
0415 };
0416
0417 #if 0
0418 int ses_match_host(struct enclosure_device *edev, void *data)
0419 {
0420 struct ses_host_edev *sed = data;
0421 struct scsi_device *sdev;
0422
0423 if (!scsi_is_sdev_device(edev->edev.parent))
0424 return 0;
0425
0426 sdev = to_scsi_device(edev->edev.parent);
0427
0428 if (sdev->host != sed->shost)
0429 return 0;
0430
0431 sed->edev = edev;
0432 return 1;
0433 }
0434 #endif
0435
0436 static void ses_process_descriptor(struct enclosure_component *ecomp,
0437 unsigned char *desc)
0438 {
0439 int eip = desc[0] & 0x10;
0440 int invalid = desc[0] & 0x80;
0441 enum scsi_protocol proto = desc[0] & 0x0f;
0442 u64 addr = 0;
0443 int slot = -1;
0444 struct ses_component *scomp = ecomp->scratch;
0445 unsigned char *d;
0446
0447 if (invalid)
0448 return;
0449
0450 switch (proto) {
0451 case SCSI_PROTOCOL_FCP:
0452 if (eip) {
0453 d = desc + 4;
0454 slot = d[3];
0455 }
0456 break;
0457 case SCSI_PROTOCOL_SAS:
0458 if (eip) {
0459 d = desc + 4;
0460 slot = d[3];
0461 d = desc + 8;
0462 } else
0463 d = desc + 4;
0464
0465 addr = (u64)d[12] << 56 |
0466 (u64)d[13] << 48 |
0467 (u64)d[14] << 40 |
0468 (u64)d[15] << 32 |
0469 (u64)d[16] << 24 |
0470 (u64)d[17] << 16 |
0471 (u64)d[18] << 8 |
0472 (u64)d[19];
0473 break;
0474 default:
0475
0476 break;
0477 }
0478 ecomp->slot = slot;
0479 scomp->addr = addr;
0480 }
0481
0482 struct efd {
0483 u64 addr;
0484 struct device *dev;
0485 };
0486
0487 static int ses_enclosure_find_by_addr(struct enclosure_device *edev,
0488 void *data)
0489 {
0490 struct efd *efd = data;
0491 int i;
0492 struct ses_component *scomp;
0493
0494 if (!edev->component[0].scratch)
0495 return 0;
0496
0497 for (i = 0; i < edev->components; i++) {
0498 scomp = edev->component[i].scratch;
0499 if (scomp->addr != efd->addr)
0500 continue;
0501
0502 if (enclosure_add_device(edev, i, efd->dev) == 0)
0503 kobject_uevent(&efd->dev->kobj, KOBJ_CHANGE);
0504 return 1;
0505 }
0506 return 0;
0507 }
0508
0509 #define INIT_ALLOC_SIZE 32
0510
0511 static void ses_enclosure_data_process(struct enclosure_device *edev,
0512 struct scsi_device *sdev,
0513 int create)
0514 {
0515 u32 result;
0516 unsigned char *buf = NULL, *type_ptr, *desc_ptr, *addl_desc_ptr = NULL;
0517 int i, j, page7_len, len, components;
0518 struct ses_device *ses_dev = edev->scratch;
0519 int types = ses_dev->page1_num_types;
0520 unsigned char *hdr_buf = kzalloc(INIT_ALLOC_SIZE, GFP_KERNEL);
0521
0522 if (!hdr_buf)
0523 goto simple_populate;
0524
0525
0526 if (ses_dev->page10)
0527 ses_recv_diag(sdev, 10, ses_dev->page10, ses_dev->page10_len);
0528
0529 result = ses_recv_diag(sdev, 7, hdr_buf, INIT_ALLOC_SIZE);
0530 if (result)
0531 goto simple_populate;
0532
0533 page7_len = len = (hdr_buf[2] << 8) + hdr_buf[3] + 4;
0534
0535 buf = kzalloc(len + 1, GFP_KERNEL);
0536 if (!buf)
0537 goto simple_populate;
0538 result = ses_recv_diag(sdev, 7, buf, len);
0539 if (result) {
0540 simple_populate:
0541 kfree(buf);
0542 buf = NULL;
0543 desc_ptr = NULL;
0544 len = 0;
0545 page7_len = 0;
0546 } else {
0547 desc_ptr = buf + 8;
0548 len = (desc_ptr[2] << 8) + desc_ptr[3];
0549
0550 desc_ptr += len + 4;
0551 }
0552 if (ses_dev->page10)
0553 addl_desc_ptr = ses_dev->page10 + 8;
0554 type_ptr = ses_dev->page1_types;
0555 components = 0;
0556 for (i = 0; i < types; i++, type_ptr += 4) {
0557 for (j = 0; j < type_ptr[1]; j++) {
0558 char *name = NULL;
0559 struct enclosure_component *ecomp;
0560
0561 if (desc_ptr) {
0562 if (desc_ptr >= buf + page7_len) {
0563 desc_ptr = NULL;
0564 } else {
0565 len = (desc_ptr[2] << 8) + desc_ptr[3];
0566 desc_ptr += 4;
0567
0568
0569 desc_ptr[len] = '\0';
0570 name = desc_ptr;
0571 }
0572 }
0573 if (type_ptr[0] == ENCLOSURE_COMPONENT_DEVICE ||
0574 type_ptr[0] == ENCLOSURE_COMPONENT_ARRAY_DEVICE) {
0575
0576 if (create)
0577 ecomp = enclosure_component_alloc(
0578 edev,
0579 components++,
0580 type_ptr[0],
0581 name);
0582 else
0583 ecomp = &edev->component[components++];
0584
0585 if (!IS_ERR(ecomp)) {
0586 if (addl_desc_ptr)
0587 ses_process_descriptor(
0588 ecomp,
0589 addl_desc_ptr);
0590 if (create)
0591 enclosure_component_register(
0592 ecomp);
0593 }
0594 }
0595 if (desc_ptr)
0596 desc_ptr += len;
0597
0598 if (addl_desc_ptr &&
0599
0600 (type_ptr[0] == ENCLOSURE_COMPONENT_DEVICE ||
0601 type_ptr[0] == ENCLOSURE_COMPONENT_ARRAY_DEVICE ||
0602 type_ptr[0] == ENCLOSURE_COMPONENT_SAS_EXPANDER ||
0603
0604 type_ptr[0] == ENCLOSURE_COMPONENT_SCSI_TARGET_PORT ||
0605 type_ptr[0] == ENCLOSURE_COMPONENT_SCSI_INITIATOR_PORT ||
0606 type_ptr[0] == ENCLOSURE_COMPONENT_CONTROLLER_ELECTRONICS))
0607 addl_desc_ptr += addl_desc_ptr[1] + 2;
0608
0609 }
0610 }
0611 kfree(buf);
0612 kfree(hdr_buf);
0613 }
0614
0615 static void ses_match_to_enclosure(struct enclosure_device *edev,
0616 struct scsi_device *sdev,
0617 int refresh)
0618 {
0619 struct scsi_device *edev_sdev = to_scsi_device(edev->edev.parent);
0620 struct efd efd = {
0621 .addr = 0,
0622 };
0623
0624 if (refresh)
0625 ses_enclosure_data_process(edev, edev_sdev, 0);
0626
0627 if (scsi_is_sas_rphy(sdev->sdev_target->dev.parent))
0628 efd.addr = sas_get_address(sdev);
0629
0630 if (efd.addr) {
0631 efd.dev = &sdev->sdev_gendev;
0632
0633 enclosure_for_each_device(ses_enclosure_find_by_addr, &efd);
0634 }
0635 }
0636
0637 static int ses_intf_add(struct device *cdev,
0638 struct class_interface *intf)
0639 {
0640 struct scsi_device *sdev = to_scsi_device(cdev->parent);
0641 struct scsi_device *tmp_sdev;
0642 unsigned char *buf = NULL, *hdr_buf, *type_ptr, page;
0643 struct ses_device *ses_dev;
0644 u32 result;
0645 int i, types, len, components = 0;
0646 int err = -ENOMEM;
0647 int num_enclosures;
0648 struct enclosure_device *edev;
0649 struct ses_component *scomp = NULL;
0650
0651 if (!scsi_device_enclosure(sdev)) {
0652
0653 struct enclosure_device *prev = NULL;
0654
0655 while ((edev = enclosure_find(&sdev->host->shost_gendev, prev)) != NULL) {
0656 ses_match_to_enclosure(edev, sdev, 1);
0657 prev = edev;
0658 }
0659 return -ENODEV;
0660 }
0661
0662
0663 if (sdev->type != TYPE_ENCLOSURE)
0664 sdev_printk(KERN_NOTICE, sdev, "Embedded Enclosure Device\n");
0665
0666 ses_dev = kzalloc(sizeof(*ses_dev), GFP_KERNEL);
0667 hdr_buf = kzalloc(INIT_ALLOC_SIZE, GFP_KERNEL);
0668 if (!hdr_buf || !ses_dev)
0669 goto err_init_free;
0670
0671 page = 1;
0672 result = ses_recv_diag(sdev, page, hdr_buf, INIT_ALLOC_SIZE);
0673 if (result)
0674 goto recv_failed;
0675
0676 len = (hdr_buf[2] << 8) + hdr_buf[3] + 4;
0677 buf = kzalloc(len, GFP_KERNEL);
0678 if (!buf)
0679 goto err_free;
0680
0681 result = ses_recv_diag(sdev, page, buf, len);
0682 if (result)
0683 goto recv_failed;
0684
0685 types = 0;
0686
0687
0688
0689 num_enclosures = buf[1] + 1;
0690
0691
0692 type_ptr = buf + 8;
0693
0694 for (i = 0; i < num_enclosures && type_ptr < buf + len; i++) {
0695 types += type_ptr[2];
0696 type_ptr += type_ptr[3] + 4;
0697 }
0698
0699 ses_dev->page1_types = type_ptr;
0700 ses_dev->page1_num_types = types;
0701
0702 for (i = 0; i < types && type_ptr < buf + len; i++, type_ptr += 4) {
0703 if (type_ptr[0] == ENCLOSURE_COMPONENT_DEVICE ||
0704 type_ptr[0] == ENCLOSURE_COMPONENT_ARRAY_DEVICE)
0705 components += type_ptr[1];
0706 }
0707 ses_dev->page1 = buf;
0708 ses_dev->page1_len = len;
0709 buf = NULL;
0710
0711 page = 2;
0712 result = ses_recv_diag(sdev, page, hdr_buf, INIT_ALLOC_SIZE);
0713 if (result)
0714 goto page2_not_supported;
0715
0716 len = (hdr_buf[2] << 8) + hdr_buf[3] + 4;
0717 buf = kzalloc(len, GFP_KERNEL);
0718 if (!buf)
0719 goto err_free;
0720
0721
0722 result = ses_recv_diag(sdev, 2, buf, len);
0723 if (result)
0724 goto recv_failed;
0725 ses_dev->page2 = buf;
0726 ses_dev->page2_len = len;
0727 buf = NULL;
0728
0729
0730
0731 page = 10;
0732 result = ses_recv_diag(sdev, page, hdr_buf, INIT_ALLOC_SIZE);
0733 if (!result) {
0734
0735 len = (hdr_buf[2] << 8) + hdr_buf[3] + 4;
0736 buf = kzalloc(len, GFP_KERNEL);
0737 if (!buf)
0738 goto err_free;
0739
0740 result = ses_recv_diag(sdev, page, buf, len);
0741 if (result)
0742 goto recv_failed;
0743 ses_dev->page10 = buf;
0744 ses_dev->page10_len = len;
0745 buf = NULL;
0746 }
0747 page2_not_supported:
0748 scomp = kcalloc(components, sizeof(struct ses_component), GFP_KERNEL);
0749 if (!scomp)
0750 goto err_free;
0751
0752 edev = enclosure_register(cdev->parent, dev_name(&sdev->sdev_gendev),
0753 components, &ses_enclosure_callbacks);
0754 if (IS_ERR(edev)) {
0755 err = PTR_ERR(edev);
0756 goto err_free;
0757 }
0758
0759 kfree(hdr_buf);
0760
0761 edev->scratch = ses_dev;
0762 for (i = 0; i < components; i++)
0763 edev->component[i].scratch = scomp + i;
0764
0765 ses_enclosure_data_process(edev, sdev, 1);
0766
0767
0768
0769 shost_for_each_device(tmp_sdev, sdev->host) {
0770 if (tmp_sdev->lun != 0 || scsi_device_enclosure(tmp_sdev))
0771 continue;
0772 ses_match_to_enclosure(edev, tmp_sdev, 0);
0773 }
0774
0775 return 0;
0776
0777 recv_failed:
0778 sdev_printk(KERN_ERR, sdev, "Failed to get diagnostic page 0x%x\n",
0779 page);
0780 err = -ENODEV;
0781 err_free:
0782 kfree(buf);
0783 kfree(scomp);
0784 kfree(ses_dev->page10);
0785 kfree(ses_dev->page2);
0786 kfree(ses_dev->page1);
0787 err_init_free:
0788 kfree(ses_dev);
0789 kfree(hdr_buf);
0790 sdev_printk(KERN_ERR, sdev, "Failed to bind enclosure %d\n", err);
0791 return err;
0792 }
0793
0794 static int ses_remove(struct device *dev)
0795 {
0796 return 0;
0797 }
0798
0799 static void ses_intf_remove_component(struct scsi_device *sdev)
0800 {
0801 struct enclosure_device *edev, *prev = NULL;
0802
0803 while ((edev = enclosure_find(&sdev->host->shost_gendev, prev)) != NULL) {
0804 prev = edev;
0805 if (!enclosure_remove_device(edev, &sdev->sdev_gendev))
0806 break;
0807 }
0808 if (edev)
0809 put_device(&edev->edev);
0810 }
0811
0812 static void ses_intf_remove_enclosure(struct scsi_device *sdev)
0813 {
0814 struct enclosure_device *edev;
0815 struct ses_device *ses_dev;
0816
0817
0818 edev = enclosure_find(&sdev->sdev_gendev, NULL);
0819 if (!edev)
0820 return;
0821
0822 ses_dev = edev->scratch;
0823 edev->scratch = NULL;
0824
0825 kfree(ses_dev->page10);
0826 kfree(ses_dev->page1);
0827 kfree(ses_dev->page2);
0828 kfree(ses_dev);
0829
0830 kfree(edev->component[0].scratch);
0831
0832 put_device(&edev->edev);
0833 enclosure_unregister(edev);
0834 }
0835
0836 static void ses_intf_remove(struct device *cdev,
0837 struct class_interface *intf)
0838 {
0839 struct scsi_device *sdev = to_scsi_device(cdev->parent);
0840
0841 if (!scsi_device_enclosure(sdev))
0842 ses_intf_remove_component(sdev);
0843 else
0844 ses_intf_remove_enclosure(sdev);
0845 }
0846
0847 static struct class_interface ses_interface = {
0848 .add_dev = ses_intf_add,
0849 .remove_dev = ses_intf_remove,
0850 };
0851
0852 static struct scsi_driver ses_template = {
0853 .gendrv = {
0854 .name = "ses",
0855 .owner = THIS_MODULE,
0856 .probe = ses_probe,
0857 .remove = ses_remove,
0858 },
0859 };
0860
0861 static int __init ses_init(void)
0862 {
0863 int err;
0864
0865 err = scsi_register_interface(&ses_interface);
0866 if (err)
0867 return err;
0868
0869 err = scsi_register_driver(&ses_template.gendrv);
0870 if (err)
0871 goto out_unreg;
0872
0873 return 0;
0874
0875 out_unreg:
0876 scsi_unregister_interface(&ses_interface);
0877 return err;
0878 }
0879
0880 static void __exit ses_exit(void)
0881 {
0882 scsi_unregister_driver(&ses_template.gendrv);
0883 scsi_unregister_interface(&ses_interface);
0884 }
0885
0886 module_init(ses_init);
0887 module_exit(ses_exit);
0888
0889 MODULE_ALIAS_SCSI_DEVICE(TYPE_ENCLOSURE);
0890
0891 MODULE_AUTHOR("James Bottomley");
0892 MODULE_DESCRIPTION("SCSI Enclosure Services (ses) driver");
0893 MODULE_LICENSE("GPL v2");