ses.c 17 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750
  1. /*
  2. * SCSI Enclosure Services
  3. *
  4. * Copyright (C) 2008 James Bottomley <James.Bottomley@HansenPartnership.com>
  5. *
  6. **-----------------------------------------------------------------------------
  7. **
  8. ** This program is free software; you can redistribute it and/or
  9. ** modify it under the terms of the GNU General Public License
  10. ** version 2 as published by the Free Software Foundation.
  11. **
  12. ** This program is distributed in the hope that it will be useful,
  13. ** but WITHOUT ANY WARRANTY; without even the implied warranty of
  14. ** MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  15. ** GNU General Public License for more details.
  16. **
  17. ** You should have received a copy of the GNU General Public License
  18. ** along with this program; if not, write to the Free Software
  19. ** Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  20. **
  21. **-----------------------------------------------------------------------------
  22. */
  23. #include <linux/slab.h>
  24. #include <linux/module.h>
  25. #include <linux/kernel.h>
  26. #include <linux/enclosure.h>
  27. #include <scsi/scsi.h>
  28. #include <scsi/scsi_cmnd.h>
  29. #include <scsi/scsi_dbg.h>
  30. #include <scsi/scsi_device.h>
  31. #include <scsi/scsi_driver.h>
  32. #include <scsi/scsi_host.h>
  33. struct ses_device {
  34. unsigned char *page1;
  35. unsigned char *page1_types;
  36. unsigned char *page2;
  37. unsigned char *page10;
  38. short page1_len;
  39. short page1_num_types;
  40. short page2_len;
  41. short page10_len;
  42. };
  43. struct ses_component {
  44. u64 addr;
  45. unsigned char *desc;
  46. };
  47. static int ses_probe(struct device *dev)
  48. {
  49. struct scsi_device *sdev = to_scsi_device(dev);
  50. int err = -ENODEV;
  51. if (sdev->type != TYPE_ENCLOSURE)
  52. goto out;
  53. err = 0;
  54. sdev_printk(KERN_NOTICE, sdev, "Attached Enclosure device\n");
  55. out:
  56. return err;
  57. }
  58. #define SES_TIMEOUT (30 * HZ)
  59. #define SES_RETRIES 3
  60. static int ses_recv_diag(struct scsi_device *sdev, int page_code,
  61. void *buf, int bufflen)
  62. {
  63. unsigned char cmd[] = {
  64. RECEIVE_DIAGNOSTIC,
  65. 1, /* Set PCV bit */
  66. page_code,
  67. bufflen >> 8,
  68. bufflen & 0xff,
  69. 0
  70. };
  71. return scsi_execute_req(sdev, cmd, DMA_FROM_DEVICE, buf, bufflen,
  72. NULL, SES_TIMEOUT, SES_RETRIES, NULL);
  73. }
  74. static int ses_send_diag(struct scsi_device *sdev, int page_code,
  75. void *buf, int bufflen)
  76. {
  77. u32 result;
  78. unsigned char cmd[] = {
  79. SEND_DIAGNOSTIC,
  80. 0x10, /* Set PF bit */
  81. 0,
  82. bufflen >> 8,
  83. bufflen & 0xff,
  84. 0
  85. };
  86. result = scsi_execute_req(sdev, cmd, DMA_TO_DEVICE, buf, bufflen,
  87. NULL, SES_TIMEOUT, SES_RETRIES, NULL);
  88. if (result)
  89. sdev_printk(KERN_ERR, sdev, "SEND DIAGNOSTIC result: %8x\n",
  90. result);
  91. return result;
  92. }
  93. static int ses_set_page2_descriptor(struct enclosure_device *edev,
  94. struct enclosure_component *ecomp,
  95. unsigned char *desc)
  96. {
  97. int i, j, count = 0, descriptor = ecomp->number;
  98. struct scsi_device *sdev = to_scsi_device(edev->edev.parent);
  99. struct ses_device *ses_dev = edev->scratch;
  100. unsigned char *type_ptr = ses_dev->page1_types;
  101. unsigned char *desc_ptr = ses_dev->page2 + 8;
  102. /* Clear everything */
  103. memset(desc_ptr, 0, ses_dev->page2_len - 8);
  104. for (i = 0; i < ses_dev->page1_num_types; i++, type_ptr += 4) {
  105. for (j = 0; j < type_ptr[1]; j++) {
  106. desc_ptr += 4;
  107. if (type_ptr[0] != ENCLOSURE_COMPONENT_DEVICE &&
  108. type_ptr[0] != ENCLOSURE_COMPONENT_ARRAY_DEVICE)
  109. continue;
  110. if (count++ == descriptor) {
  111. memcpy(desc_ptr, desc, 4);
  112. /* set select */
  113. desc_ptr[0] |= 0x80;
  114. /* clear reserved, just in case */
  115. desc_ptr[0] &= 0xf0;
  116. }
  117. }
  118. }
  119. return ses_send_diag(sdev, 2, ses_dev->page2, ses_dev->page2_len);
  120. }
  121. static unsigned char *ses_get_page2_descriptor(struct enclosure_device *edev,
  122. struct enclosure_component *ecomp)
  123. {
  124. int i, j, count = 0, descriptor = ecomp->number;
  125. struct scsi_device *sdev = to_scsi_device(edev->edev.parent);
  126. struct ses_device *ses_dev = edev->scratch;
  127. unsigned char *type_ptr = ses_dev->page1_types;
  128. unsigned char *desc_ptr = ses_dev->page2 + 8;
  129. ses_recv_diag(sdev, 2, ses_dev->page2, ses_dev->page2_len);
  130. for (i = 0; i < ses_dev->page1_num_types; i++, type_ptr += 4) {
  131. for (j = 0; j < type_ptr[1]; j++) {
  132. desc_ptr += 4;
  133. if (type_ptr[0] != ENCLOSURE_COMPONENT_DEVICE &&
  134. type_ptr[0] != ENCLOSURE_COMPONENT_ARRAY_DEVICE)
  135. continue;
  136. if (count++ == descriptor)
  137. return desc_ptr;
  138. }
  139. }
  140. return NULL;
  141. }
  142. static void ses_get_fault(struct enclosure_device *edev,
  143. struct enclosure_component *ecomp)
  144. {
  145. unsigned char *desc;
  146. desc = ses_get_page2_descriptor(edev, ecomp);
  147. if (desc)
  148. ecomp->fault = (desc[3] & 0x60) >> 4;
  149. }
  150. static int ses_set_fault(struct enclosure_device *edev,
  151. struct enclosure_component *ecomp,
  152. enum enclosure_component_setting val)
  153. {
  154. unsigned char desc[4] = {0 };
  155. switch (val) {
  156. case ENCLOSURE_SETTING_DISABLED:
  157. /* zero is disabled */
  158. break;
  159. case ENCLOSURE_SETTING_ENABLED:
  160. desc[2] = 0x02;
  161. break;
  162. default:
  163. /* SES doesn't do the SGPIO blink settings */
  164. return -EINVAL;
  165. }
  166. return ses_set_page2_descriptor(edev, ecomp, desc);
  167. }
  168. static void ses_get_status(struct enclosure_device *edev,
  169. struct enclosure_component *ecomp)
  170. {
  171. unsigned char *desc;
  172. desc = ses_get_page2_descriptor(edev, ecomp);
  173. if (desc)
  174. ecomp->status = (desc[0] & 0x0f);
  175. }
  176. static void ses_get_locate(struct enclosure_device *edev,
  177. struct enclosure_component *ecomp)
  178. {
  179. unsigned char *desc;
  180. desc = ses_get_page2_descriptor(edev, ecomp);
  181. if (desc)
  182. ecomp->locate = (desc[2] & 0x02) ? 1 : 0;
  183. }
  184. static int ses_set_locate(struct enclosure_device *edev,
  185. struct enclosure_component *ecomp,
  186. enum enclosure_component_setting val)
  187. {
  188. unsigned char desc[4] = {0 };
  189. switch (val) {
  190. case ENCLOSURE_SETTING_DISABLED:
  191. /* zero is disabled */
  192. break;
  193. case ENCLOSURE_SETTING_ENABLED:
  194. desc[2] = 0x02;
  195. break;
  196. default:
  197. /* SES doesn't do the SGPIO blink settings */
  198. return -EINVAL;
  199. }
  200. return ses_set_page2_descriptor(edev, ecomp, desc);
  201. }
  202. static int ses_set_active(struct enclosure_device *edev,
  203. struct enclosure_component *ecomp,
  204. enum enclosure_component_setting val)
  205. {
  206. unsigned char desc[4] = {0 };
  207. switch (val) {
  208. case ENCLOSURE_SETTING_DISABLED:
  209. /* zero is disabled */
  210. ecomp->active = 0;
  211. break;
  212. case ENCLOSURE_SETTING_ENABLED:
  213. desc[2] = 0x80;
  214. ecomp->active = 1;
  215. break;
  216. default:
  217. /* SES doesn't do the SGPIO blink settings */
  218. return -EINVAL;
  219. }
  220. return ses_set_page2_descriptor(edev, ecomp, desc);
  221. }
  222. static struct enclosure_component_callbacks ses_enclosure_callbacks = {
  223. .get_fault = ses_get_fault,
  224. .set_fault = ses_set_fault,
  225. .get_status = ses_get_status,
  226. .get_locate = ses_get_locate,
  227. .set_locate = ses_set_locate,
  228. .set_active = ses_set_active,
  229. };
  230. struct ses_host_edev {
  231. struct Scsi_Host *shost;
  232. struct enclosure_device *edev;
  233. };
  234. #if 0
  235. int ses_match_host(struct enclosure_device *edev, void *data)
  236. {
  237. struct ses_host_edev *sed = data;
  238. struct scsi_device *sdev;
  239. if (!scsi_is_sdev_device(edev->edev.parent))
  240. return 0;
  241. sdev = to_scsi_device(edev->edev.parent);
  242. if (sdev->host != sed->shost)
  243. return 0;
  244. sed->edev = edev;
  245. return 1;
  246. }
  247. #endif /* 0 */
  248. static void ses_process_descriptor(struct enclosure_component *ecomp,
  249. unsigned char *desc)
  250. {
  251. int eip = desc[0] & 0x10;
  252. int invalid = desc[0] & 0x80;
  253. enum scsi_protocol proto = desc[0] & 0x0f;
  254. u64 addr = 0;
  255. struct ses_component *scomp = ecomp->scratch;
  256. unsigned char *d;
  257. scomp->desc = desc;
  258. if (invalid)
  259. return;
  260. switch (proto) {
  261. case SCSI_PROTOCOL_SAS:
  262. if (eip)
  263. d = desc + 8;
  264. else
  265. d = desc + 4;
  266. /* only take the phy0 addr */
  267. addr = (u64)d[12] << 56 |
  268. (u64)d[13] << 48 |
  269. (u64)d[14] << 40 |
  270. (u64)d[15] << 32 |
  271. (u64)d[16] << 24 |
  272. (u64)d[17] << 16 |
  273. (u64)d[18] << 8 |
  274. (u64)d[19];
  275. break;
  276. default:
  277. /* FIXME: Need to add more protocols than just SAS */
  278. break;
  279. }
  280. scomp->addr = addr;
  281. }
  282. struct efd {
  283. u64 addr;
  284. struct device *dev;
  285. };
  286. static int ses_enclosure_find_by_addr(struct enclosure_device *edev,
  287. void *data)
  288. {
  289. struct efd *efd = data;
  290. int i;
  291. struct ses_component *scomp;
  292. if (!edev->component[0].scratch)
  293. return 0;
  294. for (i = 0; i < edev->components; i++) {
  295. scomp = edev->component[i].scratch;
  296. if (scomp->addr != efd->addr)
  297. continue;
  298. enclosure_add_device(edev, i, efd->dev);
  299. return 1;
  300. }
  301. return 0;
  302. }
  303. #define INIT_ALLOC_SIZE 32
  304. static void ses_enclosure_data_process(struct enclosure_device *edev,
  305. struct scsi_device *sdev,
  306. int create)
  307. {
  308. u32 result;
  309. unsigned char *buf = NULL, *type_ptr, *desc_ptr, *addl_desc_ptr = NULL;
  310. int i, j, page7_len, len, components;
  311. struct ses_device *ses_dev = edev->scratch;
  312. int types = ses_dev->page1_num_types;
  313. unsigned char *hdr_buf = kzalloc(INIT_ALLOC_SIZE, GFP_KERNEL);
  314. if (!hdr_buf)
  315. goto simple_populate;
  316. /* re-read page 10 */
  317. if (ses_dev->page10)
  318. ses_recv_diag(sdev, 10, ses_dev->page10, ses_dev->page10_len);
  319. /* Page 7 for the descriptors is optional */
  320. result = ses_recv_diag(sdev, 7, hdr_buf, INIT_ALLOC_SIZE);
  321. if (result)
  322. goto simple_populate;
  323. page7_len = len = (hdr_buf[2] << 8) + hdr_buf[3] + 4;
  324. /* add 1 for trailing '\0' we'll use */
  325. buf = kzalloc(len + 1, GFP_KERNEL);
  326. if (!buf)
  327. goto simple_populate;
  328. result = ses_recv_diag(sdev, 7, buf, len);
  329. if (result) {
  330. simple_populate:
  331. kfree(buf);
  332. buf = NULL;
  333. desc_ptr = NULL;
  334. len = 0;
  335. page7_len = 0;
  336. } else {
  337. desc_ptr = buf + 8;
  338. len = (desc_ptr[2] << 8) + desc_ptr[3];
  339. /* skip past overall descriptor */
  340. desc_ptr += len + 4;
  341. }
  342. if (ses_dev->page10)
  343. addl_desc_ptr = ses_dev->page10 + 8;
  344. type_ptr = ses_dev->page1_types;
  345. components = 0;
  346. for (i = 0; i < types; i++, type_ptr += 4) {
  347. for (j = 0; j < type_ptr[1]; j++) {
  348. char *name = NULL;
  349. struct enclosure_component *ecomp;
  350. if (desc_ptr) {
  351. if (desc_ptr >= buf + page7_len) {
  352. desc_ptr = NULL;
  353. } else {
  354. len = (desc_ptr[2] << 8) + desc_ptr[3];
  355. desc_ptr += 4;
  356. /* Add trailing zero - pushes into
  357. * reserved space */
  358. desc_ptr[len] = '\0';
  359. name = desc_ptr;
  360. }
  361. }
  362. if (type_ptr[0] == ENCLOSURE_COMPONENT_DEVICE ||
  363. type_ptr[0] == ENCLOSURE_COMPONENT_ARRAY_DEVICE) {
  364. if (create)
  365. ecomp = enclosure_component_register(edev,
  366. components++,
  367. type_ptr[0],
  368. name);
  369. else
  370. ecomp = &edev->component[components++];
  371. if (!IS_ERR(ecomp) && addl_desc_ptr)
  372. ses_process_descriptor(ecomp,
  373. addl_desc_ptr);
  374. }
  375. if (desc_ptr)
  376. desc_ptr += len;
  377. if (addl_desc_ptr)
  378. addl_desc_ptr += addl_desc_ptr[1] + 2;
  379. }
  380. }
  381. kfree(buf);
  382. kfree(hdr_buf);
  383. }
  384. static void ses_match_to_enclosure(struct enclosure_device *edev,
  385. struct scsi_device *sdev)
  386. {
  387. unsigned char *buf;
  388. unsigned char *desc;
  389. unsigned int vpd_len;
  390. struct efd efd = {
  391. .addr = 0,
  392. };
  393. buf = kmalloc(INIT_ALLOC_SIZE, GFP_KERNEL);
  394. if (!buf || scsi_get_vpd_page(sdev, 0x83, buf, INIT_ALLOC_SIZE))
  395. goto free;
  396. ses_enclosure_data_process(edev, to_scsi_device(edev->edev.parent), 0);
  397. vpd_len = ((buf[2] << 8) | buf[3]) + 4;
  398. kfree(buf);
  399. buf = kmalloc(vpd_len, GFP_KERNEL);
  400. if (!buf ||scsi_get_vpd_page(sdev, 0x83, buf, vpd_len))
  401. goto free;
  402. desc = buf + 4;
  403. while (desc < buf + vpd_len) {
  404. enum scsi_protocol proto = desc[0] >> 4;
  405. u8 code_set = desc[0] & 0x0f;
  406. u8 piv = desc[1] & 0x80;
  407. u8 assoc = (desc[1] & 0x30) >> 4;
  408. u8 type = desc[1] & 0x0f;
  409. u8 len = desc[3];
  410. if (piv && code_set == 1 && assoc == 1
  411. && proto == SCSI_PROTOCOL_SAS && type == 3 && len == 8)
  412. efd.addr = (u64)desc[4] << 56 |
  413. (u64)desc[5] << 48 |
  414. (u64)desc[6] << 40 |
  415. (u64)desc[7] << 32 |
  416. (u64)desc[8] << 24 |
  417. (u64)desc[9] << 16 |
  418. (u64)desc[10] << 8 |
  419. (u64)desc[11];
  420. desc += len + 4;
  421. }
  422. if (!efd.addr)
  423. goto free;
  424. efd.dev = &sdev->sdev_gendev;
  425. enclosure_for_each_device(ses_enclosure_find_by_addr, &efd);
  426. free:
  427. kfree(buf);
  428. }
  429. static int ses_intf_add(struct device *cdev,
  430. struct class_interface *intf)
  431. {
  432. struct scsi_device *sdev = to_scsi_device(cdev->parent);
  433. struct scsi_device *tmp_sdev;
  434. unsigned char *buf = NULL, *hdr_buf, *type_ptr;
  435. struct ses_device *ses_dev;
  436. u32 result;
  437. int i, types, len, components = 0;
  438. int err = -ENOMEM;
  439. int num_enclosures;
  440. struct enclosure_device *edev;
  441. struct ses_component *scomp = NULL;
  442. if (!scsi_device_enclosure(sdev)) {
  443. /* not an enclosure, but might be in one */
  444. struct enclosure_device *prev = NULL;
  445. while ((edev = enclosure_find(&sdev->host->shost_gendev, prev)) != NULL) {
  446. ses_match_to_enclosure(edev, sdev);
  447. prev = edev;
  448. }
  449. return -ENODEV;
  450. }
  451. /* TYPE_ENCLOSURE prints a message in probe */
  452. if (sdev->type != TYPE_ENCLOSURE)
  453. sdev_printk(KERN_NOTICE, sdev, "Embedded Enclosure Device\n");
  454. ses_dev = kzalloc(sizeof(*ses_dev), GFP_KERNEL);
  455. hdr_buf = kzalloc(INIT_ALLOC_SIZE, GFP_KERNEL);
  456. if (!hdr_buf || !ses_dev)
  457. goto err_init_free;
  458. result = ses_recv_diag(sdev, 1, hdr_buf, INIT_ALLOC_SIZE);
  459. if (result)
  460. goto recv_failed;
  461. len = (hdr_buf[2] << 8) + hdr_buf[3] + 4;
  462. buf = kzalloc(len, GFP_KERNEL);
  463. if (!buf)
  464. goto err_free;
  465. result = ses_recv_diag(sdev, 1, buf, len);
  466. if (result)
  467. goto recv_failed;
  468. types = 0;
  469. /* we always have one main enclosure and the rest are referred
  470. * to as secondary subenclosures */
  471. num_enclosures = buf[1] + 1;
  472. /* begin at the enclosure descriptor */
  473. type_ptr = buf + 8;
  474. /* skip all the enclosure descriptors */
  475. for (i = 0; i < num_enclosures && type_ptr < buf + len; i++) {
  476. types += type_ptr[2];
  477. type_ptr += type_ptr[3] + 4;
  478. }
  479. ses_dev->page1_types = type_ptr;
  480. ses_dev->page1_num_types = types;
  481. for (i = 0; i < types && type_ptr < buf + len; i++, type_ptr += 4) {
  482. if (type_ptr[0] == ENCLOSURE_COMPONENT_DEVICE ||
  483. type_ptr[0] == ENCLOSURE_COMPONENT_ARRAY_DEVICE)
  484. components += type_ptr[1];
  485. }
  486. ses_dev->page1 = buf;
  487. ses_dev->page1_len = len;
  488. buf = NULL;
  489. result = ses_recv_diag(sdev, 2, hdr_buf, INIT_ALLOC_SIZE);
  490. if (result)
  491. goto recv_failed;
  492. len = (hdr_buf[2] << 8) + hdr_buf[3] + 4;
  493. buf = kzalloc(len, GFP_KERNEL);
  494. if (!buf)
  495. goto err_free;
  496. /* make sure getting page 2 actually works */
  497. result = ses_recv_diag(sdev, 2, buf, len);
  498. if (result)
  499. goto recv_failed;
  500. ses_dev->page2 = buf;
  501. ses_dev->page2_len = len;
  502. buf = NULL;
  503. /* The additional information page --- allows us
  504. * to match up the devices */
  505. result = ses_recv_diag(sdev, 10, hdr_buf, INIT_ALLOC_SIZE);
  506. if (!result) {
  507. len = (hdr_buf[2] << 8) + hdr_buf[3] + 4;
  508. buf = kzalloc(len, GFP_KERNEL);
  509. if (!buf)
  510. goto err_free;
  511. result = ses_recv_diag(sdev, 10, buf, len);
  512. if (result)
  513. goto recv_failed;
  514. ses_dev->page10 = buf;
  515. ses_dev->page10_len = len;
  516. buf = NULL;
  517. }
  518. scomp = kzalloc(sizeof(struct ses_component) * components, GFP_KERNEL);
  519. if (!scomp)
  520. goto err_free;
  521. edev = enclosure_register(cdev->parent, dev_name(&sdev->sdev_gendev),
  522. components, &ses_enclosure_callbacks);
  523. if (IS_ERR(edev)) {
  524. err = PTR_ERR(edev);
  525. goto err_free;
  526. }
  527. kfree(hdr_buf);
  528. edev->scratch = ses_dev;
  529. for (i = 0; i < components; i++)
  530. edev->component[i].scratch = scomp + i;
  531. ses_enclosure_data_process(edev, sdev, 1);
  532. /* see if there are any devices matching before
  533. * we found the enclosure */
  534. shost_for_each_device(tmp_sdev, sdev->host) {
  535. if (tmp_sdev->lun != 0 || scsi_device_enclosure(tmp_sdev))
  536. continue;
  537. ses_match_to_enclosure(edev, tmp_sdev);
  538. }
  539. return 0;
  540. recv_failed:
  541. sdev_printk(KERN_ERR, sdev, "Failed to get diagnostic page 0x%x\n",
  542. result);
  543. err = -ENODEV;
  544. err_free:
  545. kfree(buf);
  546. kfree(scomp);
  547. kfree(ses_dev->page10);
  548. kfree(ses_dev->page2);
  549. kfree(ses_dev->page1);
  550. err_init_free:
  551. kfree(ses_dev);
  552. kfree(hdr_buf);
  553. sdev_printk(KERN_ERR, sdev, "Failed to bind enclosure %d\n", err);
  554. return err;
  555. }
  556. static int ses_remove(struct device *dev)
  557. {
  558. return 0;
  559. }
  560. static void ses_intf_remove_component(struct scsi_device *sdev)
  561. {
  562. struct enclosure_device *edev, *prev = NULL;
  563. while ((edev = enclosure_find(&sdev->host->shost_gendev, prev)) != NULL) {
  564. prev = edev;
  565. if (!enclosure_remove_device(edev, &sdev->sdev_gendev))
  566. break;
  567. }
  568. if (edev)
  569. put_device(&edev->edev);
  570. }
  571. static void ses_intf_remove_enclosure(struct scsi_device *sdev)
  572. {
  573. struct enclosure_device *edev;
  574. struct ses_device *ses_dev;
  575. /* exact match to this enclosure */
  576. edev = enclosure_find(&sdev->sdev_gendev, NULL);
  577. if (!edev)
  578. return;
  579. ses_dev = edev->scratch;
  580. edev->scratch = NULL;
  581. kfree(ses_dev->page10);
  582. kfree(ses_dev->page1);
  583. kfree(ses_dev->page2);
  584. kfree(ses_dev);
  585. kfree(edev->component[0].scratch);
  586. put_device(&edev->edev);
  587. enclosure_unregister(edev);
  588. }
  589. static void ses_intf_remove(struct device *cdev,
  590. struct class_interface *intf)
  591. {
  592. struct scsi_device *sdev = to_scsi_device(cdev->parent);
  593. if (!scsi_device_enclosure(sdev))
  594. ses_intf_remove_component(sdev);
  595. else
  596. ses_intf_remove_enclosure(sdev);
  597. }
  598. static struct class_interface ses_interface = {
  599. .add_dev = ses_intf_add,
  600. .remove_dev = ses_intf_remove,
  601. };
  602. static struct scsi_driver ses_template = {
  603. .owner = THIS_MODULE,
  604. .gendrv = {
  605. .name = "ses",
  606. .probe = ses_probe,
  607. .remove = ses_remove,
  608. },
  609. };
  610. static int __init ses_init(void)
  611. {
  612. int err;
  613. err = scsi_register_interface(&ses_interface);
  614. if (err)
  615. return err;
  616. err = scsi_register_driver(&ses_template.gendrv);
  617. if (err)
  618. goto out_unreg;
  619. return 0;
  620. out_unreg:
  621. scsi_unregister_interface(&ses_interface);
  622. return err;
  623. }
  624. static void __exit ses_exit(void)
  625. {
  626. scsi_unregister_driver(&ses_template.gendrv);
  627. scsi_unregister_interface(&ses_interface);
  628. }
  629. module_init(ses_init);
  630. module_exit(ses_exit);
  631. MODULE_ALIAS_SCSI_DEVICE(TYPE_ENCLOSURE);
  632. MODULE_AUTHOR("James Bottomley");
  633. MODULE_DESCRIPTION("SCSI Enclosure Services (ses) driver");
  634. MODULE_LICENSE("GPL v2");