ses.c 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940
  1. // SPDX-License-Identifier: GPL-2.0-only
  2. /*
  3. * SCSI Enclosure Services
  4. *
  5. * Copyright (C) 2008 James Bottomley <James.Bottomley@HansenPartnership.com>
  6. */
  7. #include <linux/slab.h>
  8. #include <linux/module.h>
  9. #include <linux/kernel.h>
  10. #include <linux/enclosure.h>
  11. #include <linux/unaligned.h>
  12. #include <scsi/scsi.h>
  13. #include <scsi/scsi_cmnd.h>
  14. #include <scsi/scsi_dbg.h>
  15. #include <scsi/scsi_device.h>
  16. #include <scsi/scsi_driver.h>
  17. #include <scsi/scsi_host.h>
  18. #include <scsi/scsi_transport_sas.h>
  19. struct ses_device {
  20. unsigned char *page1;
  21. unsigned char *page1_types;
  22. unsigned char *page2;
  23. unsigned char *page10;
  24. short page1_len;
  25. short page1_num_types;
  26. short page2_len;
  27. short page10_len;
  28. };
  29. struct ses_component {
  30. u64 addr;
  31. };
  32. static bool ses_page2_supported(struct enclosure_device *edev)
  33. {
  34. struct ses_device *ses_dev = edev->scratch;
  35. return (ses_dev->page2 != NULL);
  36. }
  37. static int ses_probe(struct scsi_device *sdev)
  38. {
  39. int err = -ENODEV;
  40. if (sdev->type != TYPE_ENCLOSURE)
  41. goto out;
  42. err = 0;
  43. sdev_printk(KERN_NOTICE, sdev, "Attached Enclosure device\n");
  44. out:
  45. return err;
  46. }
  47. #define SES_TIMEOUT (30 * HZ)
  48. #define SES_RETRIES 3
  49. static void init_device_slot_control(unsigned char *dest_desc,
  50. struct enclosure_component *ecomp,
  51. unsigned char *status)
  52. {
  53. memcpy(dest_desc, status, 4);
  54. dest_desc[0] = 0;
  55. /* only clear byte 1 for ENCLOSURE_COMPONENT_DEVICE */
  56. if (ecomp->type == ENCLOSURE_COMPONENT_DEVICE)
  57. dest_desc[1] = 0;
  58. dest_desc[2] &= 0xde;
  59. dest_desc[3] &= 0x3c;
  60. }
  61. static int ses_recv_diag(struct scsi_device *sdev, int page_code,
  62. void *buf, int bufflen)
  63. {
  64. int ret;
  65. unsigned char cmd[] = {
  66. RECEIVE_DIAGNOSTIC,
  67. 1, /* Set PCV bit */
  68. page_code,
  69. bufflen >> 8,
  70. bufflen & 0xff,
  71. 0
  72. };
  73. unsigned char recv_page_code;
  74. struct scsi_failure failure_defs[] = {
  75. {
  76. .sense = UNIT_ATTENTION,
  77. .asc = 0x29,
  78. .ascq = SCMD_FAILURE_ASCQ_ANY,
  79. .allowed = SES_RETRIES,
  80. .result = SAM_STAT_CHECK_CONDITION,
  81. },
  82. {
  83. .sense = NOT_READY,
  84. .asc = SCMD_FAILURE_ASC_ANY,
  85. .ascq = SCMD_FAILURE_ASCQ_ANY,
  86. .allowed = SES_RETRIES,
  87. .result = SAM_STAT_CHECK_CONDITION,
  88. },
  89. {}
  90. };
  91. struct scsi_failures failures = {
  92. .failure_definitions = failure_defs,
  93. };
  94. const struct scsi_exec_args exec_args = {
  95. .failures = &failures,
  96. };
  97. ret = scsi_execute_cmd(sdev, cmd, REQ_OP_DRV_IN, buf, bufflen,
  98. SES_TIMEOUT, 1, &exec_args);
  99. if (unlikely(ret))
  100. return ret;
  101. recv_page_code = ((unsigned char *)buf)[0];
  102. if (likely(recv_page_code == page_code))
  103. return ret;
  104. /* successful diagnostic but wrong page code. This happens to some
  105. * USB devices, just print a message and pretend there was an error */
  106. sdev_printk(KERN_ERR, sdev,
  107. "Wrong diagnostic page; asked for %d got %u\n",
  108. page_code, recv_page_code);
  109. return -EINVAL;
  110. }
  111. static int ses_send_diag(struct scsi_device *sdev, int page_code,
  112. void *buf, int bufflen)
  113. {
  114. int result;
  115. unsigned char cmd[] = {
  116. SEND_DIAGNOSTIC,
  117. 0x10, /* Set PF bit */
  118. 0,
  119. bufflen >> 8,
  120. bufflen & 0xff,
  121. 0
  122. };
  123. struct scsi_failure failure_defs[] = {
  124. {
  125. .sense = UNIT_ATTENTION,
  126. .asc = 0x29,
  127. .ascq = SCMD_FAILURE_ASCQ_ANY,
  128. .allowed = SES_RETRIES,
  129. .result = SAM_STAT_CHECK_CONDITION,
  130. },
  131. {
  132. .sense = NOT_READY,
  133. .asc = SCMD_FAILURE_ASC_ANY,
  134. .ascq = SCMD_FAILURE_ASCQ_ANY,
  135. .allowed = SES_RETRIES,
  136. .result = SAM_STAT_CHECK_CONDITION,
  137. },
  138. {}
  139. };
  140. struct scsi_failures failures = {
  141. .failure_definitions = failure_defs,
  142. };
  143. const struct scsi_exec_args exec_args = {
  144. .failures = &failures,
  145. };
  146. result = scsi_execute_cmd(sdev, cmd, REQ_OP_DRV_OUT, buf, bufflen,
  147. SES_TIMEOUT, 1, &exec_args);
  148. if (result)
  149. sdev_printk(KERN_ERR, sdev, "SEND DIAGNOSTIC result: %8x\n",
  150. result);
  151. return result;
  152. }
  153. static int ses_set_page2_descriptor(struct enclosure_device *edev,
  154. struct enclosure_component *ecomp,
  155. unsigned char *desc)
  156. {
  157. int i, j, count = 0, descriptor = ecomp->number;
  158. struct scsi_device *sdev = to_scsi_device(edev->edev.parent);
  159. struct ses_device *ses_dev = edev->scratch;
  160. unsigned char *type_ptr = ses_dev->page1_types;
  161. unsigned char *desc_ptr = ses_dev->page2 + 8;
  162. /* Clear everything */
  163. memset(desc_ptr, 0, ses_dev->page2_len - 8);
  164. for (i = 0; i < ses_dev->page1_num_types; i++, type_ptr += 4) {
  165. for (j = 0; j < type_ptr[1]; j++) {
  166. desc_ptr += 4;
  167. if (type_ptr[0] != ENCLOSURE_COMPONENT_DEVICE &&
  168. type_ptr[0] != ENCLOSURE_COMPONENT_ARRAY_DEVICE)
  169. continue;
  170. if (count++ == descriptor) {
  171. memcpy(desc_ptr, desc, 4);
  172. /* set select */
  173. desc_ptr[0] |= 0x80;
  174. /* clear reserved, just in case */
  175. desc_ptr[0] &= 0xf0;
  176. }
  177. }
  178. }
  179. return ses_send_diag(sdev, 2, ses_dev->page2, ses_dev->page2_len);
  180. }
  181. static unsigned char *ses_get_page2_descriptor(struct enclosure_device *edev,
  182. struct enclosure_component *ecomp)
  183. {
  184. int i, j, count = 0, descriptor = ecomp->number;
  185. struct scsi_device *sdev = to_scsi_device(edev->edev.parent);
  186. struct ses_device *ses_dev = edev->scratch;
  187. unsigned char *type_ptr = ses_dev->page1_types;
  188. unsigned char *desc_ptr = ses_dev->page2 + 8;
  189. if (ses_recv_diag(sdev, 2, ses_dev->page2, ses_dev->page2_len))
  190. return NULL;
  191. for (i = 0; i < ses_dev->page1_num_types; i++, type_ptr += 4) {
  192. for (j = 0; j < type_ptr[1]; j++) {
  193. desc_ptr += 4;
  194. if (type_ptr[0] != ENCLOSURE_COMPONENT_DEVICE &&
  195. type_ptr[0] != ENCLOSURE_COMPONENT_ARRAY_DEVICE)
  196. continue;
  197. if (count++ == descriptor)
  198. return desc_ptr;
  199. }
  200. }
  201. return NULL;
  202. }
  203. /* For device slot and array device slot elements, byte 3 bit 6
  204. * is "fault sensed" while byte 3 bit 5 is "fault reqstd". As this
  205. * code stands these bits are shifted 4 positions right so in
  206. * sysfs they will appear as bits 2 and 1 respectively. Strange. */
  207. static void ses_get_fault(struct enclosure_device *edev,
  208. struct enclosure_component *ecomp)
  209. {
  210. unsigned char *desc;
  211. if (!ses_page2_supported(edev)) {
  212. ecomp->fault = 0;
  213. return;
  214. }
  215. desc = ses_get_page2_descriptor(edev, ecomp);
  216. if (desc)
  217. ecomp->fault = (desc[3] & 0x60) >> 4;
  218. }
  219. static int ses_set_fault(struct enclosure_device *edev,
  220. struct enclosure_component *ecomp,
  221. enum enclosure_component_setting val)
  222. {
  223. unsigned char desc[4];
  224. unsigned char *desc_ptr;
  225. if (!ses_page2_supported(edev))
  226. return -EINVAL;
  227. desc_ptr = ses_get_page2_descriptor(edev, ecomp);
  228. if (!desc_ptr)
  229. return -EIO;
  230. init_device_slot_control(desc, ecomp, desc_ptr);
  231. switch (val) {
  232. case ENCLOSURE_SETTING_DISABLED:
  233. desc[3] &= 0xdf;
  234. break;
  235. case ENCLOSURE_SETTING_ENABLED:
  236. desc[3] |= 0x20;
  237. break;
  238. default:
  239. /* SES doesn't do the SGPIO blink settings */
  240. return -EINVAL;
  241. }
  242. return ses_set_page2_descriptor(edev, ecomp, desc);
  243. }
  244. static void ses_get_status(struct enclosure_device *edev,
  245. struct enclosure_component *ecomp)
  246. {
  247. unsigned char *desc;
  248. if (!ses_page2_supported(edev)) {
  249. ecomp->status = 0;
  250. return;
  251. }
  252. desc = ses_get_page2_descriptor(edev, ecomp);
  253. if (desc)
  254. ecomp->status = (desc[0] & 0x0f);
  255. }
  256. static void ses_get_locate(struct enclosure_device *edev,
  257. struct enclosure_component *ecomp)
  258. {
  259. unsigned char *desc;
  260. if (!ses_page2_supported(edev)) {
  261. ecomp->locate = 0;
  262. return;
  263. }
  264. desc = ses_get_page2_descriptor(edev, ecomp);
  265. if (desc)
  266. ecomp->locate = (desc[2] & 0x02) ? 1 : 0;
  267. }
  268. static int ses_set_locate(struct enclosure_device *edev,
  269. struct enclosure_component *ecomp,
  270. enum enclosure_component_setting val)
  271. {
  272. unsigned char desc[4];
  273. unsigned char *desc_ptr;
  274. if (!ses_page2_supported(edev))
  275. return -EINVAL;
  276. desc_ptr = ses_get_page2_descriptor(edev, ecomp);
  277. if (!desc_ptr)
  278. return -EIO;
  279. init_device_slot_control(desc, ecomp, desc_ptr);
  280. switch (val) {
  281. case ENCLOSURE_SETTING_DISABLED:
  282. desc[2] &= 0xfd;
  283. break;
  284. case ENCLOSURE_SETTING_ENABLED:
  285. desc[2] |= 0x02;
  286. break;
  287. default:
  288. /* SES doesn't do the SGPIO blink settings */
  289. return -EINVAL;
  290. }
  291. return ses_set_page2_descriptor(edev, ecomp, desc);
  292. }
  293. static int ses_set_active(struct enclosure_device *edev,
  294. struct enclosure_component *ecomp,
  295. enum enclosure_component_setting val)
  296. {
  297. unsigned char desc[4];
  298. unsigned char *desc_ptr;
  299. if (!ses_page2_supported(edev))
  300. return -EINVAL;
  301. desc_ptr = ses_get_page2_descriptor(edev, ecomp);
  302. if (!desc_ptr)
  303. return -EIO;
  304. init_device_slot_control(desc, ecomp, desc_ptr);
  305. switch (val) {
  306. case ENCLOSURE_SETTING_DISABLED:
  307. desc[2] &= 0x7f;
  308. ecomp->active = 0;
  309. break;
  310. case ENCLOSURE_SETTING_ENABLED:
  311. desc[2] |= 0x80;
  312. ecomp->active = 1;
  313. break;
  314. default:
  315. /* SES doesn't do the SGPIO blink settings */
  316. return -EINVAL;
  317. }
  318. return ses_set_page2_descriptor(edev, ecomp, desc);
  319. }
  320. static int ses_show_id(struct enclosure_device *edev, char *buf)
  321. {
  322. struct ses_device *ses_dev = edev->scratch;
  323. unsigned long long id = get_unaligned_be64(ses_dev->page1+8+4);
  324. return sprintf(buf, "%#llx\n", id);
  325. }
  326. static void ses_get_power_status(struct enclosure_device *edev,
  327. struct enclosure_component *ecomp)
  328. {
  329. unsigned char *desc;
  330. if (!ses_page2_supported(edev)) {
  331. ecomp->power_status = 0;
  332. return;
  333. }
  334. desc = ses_get_page2_descriptor(edev, ecomp);
  335. if (desc)
  336. ecomp->power_status = (desc[3] & 0x10) ? 0 : 1;
  337. }
  338. static int ses_set_power_status(struct enclosure_device *edev,
  339. struct enclosure_component *ecomp,
  340. int val)
  341. {
  342. unsigned char desc[4];
  343. unsigned char *desc_ptr;
  344. if (!ses_page2_supported(edev))
  345. return -EINVAL;
  346. desc_ptr = ses_get_page2_descriptor(edev, ecomp);
  347. if (!desc_ptr)
  348. return -EIO;
  349. init_device_slot_control(desc, ecomp, desc_ptr);
  350. switch (val) {
  351. /* power = 1 is device_off = 0 and vice versa */
  352. case 0:
  353. desc[3] |= 0x10;
  354. break;
  355. case 1:
  356. desc[3] &= 0xef;
  357. break;
  358. default:
  359. return -EINVAL;
  360. }
  361. ecomp->power_status = val;
  362. return ses_set_page2_descriptor(edev, ecomp, desc);
  363. }
  364. static struct enclosure_component_callbacks ses_enclosure_callbacks = {
  365. .get_fault = ses_get_fault,
  366. .set_fault = ses_set_fault,
  367. .get_status = ses_get_status,
  368. .get_locate = ses_get_locate,
  369. .set_locate = ses_set_locate,
  370. .get_power_status = ses_get_power_status,
  371. .set_power_status = ses_set_power_status,
  372. .set_active = ses_set_active,
  373. .show_id = ses_show_id,
  374. };
  375. struct ses_host_edev {
  376. struct Scsi_Host *shost;
  377. struct enclosure_device *edev;
  378. };
  379. #if 0
  380. int ses_match_host(struct enclosure_device *edev, void *data)
  381. {
  382. struct ses_host_edev *sed = data;
  383. struct scsi_device *sdev;
  384. if (!scsi_is_sdev_device(edev->edev.parent))
  385. return 0;
  386. sdev = to_scsi_device(edev->edev.parent);
  387. if (sdev->host != sed->shost)
  388. return 0;
  389. sed->edev = edev;
  390. return 1;
  391. }
  392. #endif /* 0 */
  393. static int ses_process_descriptor(struct enclosure_component *ecomp,
  394. unsigned char *desc, int max_desc_len)
  395. {
  396. int eip = desc[0] & 0x10;
  397. int invalid = desc[0] & 0x80;
  398. enum scsi_protocol proto = desc[0] & 0x0f;
  399. u64 addr = 0;
  400. int slot = -1;
  401. struct ses_component *scomp = ecomp->scratch;
  402. unsigned char *d;
  403. if (invalid)
  404. return 0;
  405. switch (proto) {
  406. case SCSI_PROTOCOL_FCP:
  407. if (eip) {
  408. if (max_desc_len <= 7)
  409. return 1;
  410. d = desc + 4;
  411. slot = d[3];
  412. }
  413. break;
  414. case SCSI_PROTOCOL_SAS:
  415. if (eip) {
  416. if (max_desc_len <= 27)
  417. return 1;
  418. d = desc + 4;
  419. slot = d[3];
  420. d = desc + 8;
  421. } else {
  422. if (max_desc_len <= 23)
  423. return 1;
  424. d = desc + 4;
  425. }
  426. /* only take the phy0 addr */
  427. addr = (u64)d[12] << 56 |
  428. (u64)d[13] << 48 |
  429. (u64)d[14] << 40 |
  430. (u64)d[15] << 32 |
  431. (u64)d[16] << 24 |
  432. (u64)d[17] << 16 |
  433. (u64)d[18] << 8 |
  434. (u64)d[19];
  435. break;
  436. default:
  437. /* FIXME: Need to add more protocols than just SAS */
  438. break;
  439. }
  440. ecomp->slot = slot;
  441. scomp->addr = addr;
  442. return 0;
  443. }
  444. struct efd {
  445. u64 addr;
  446. struct device *dev;
  447. };
  448. static int ses_enclosure_find_by_addr(struct enclosure_device *edev,
  449. struct efd *efd)
  450. {
  451. int i;
  452. struct ses_component *scomp;
  453. for (i = 0; i < edev->components; i++) {
  454. scomp = edev->component[i].scratch;
  455. if (scomp->addr != efd->addr)
  456. continue;
  457. if (enclosure_add_device(edev, i, efd->dev) == 0)
  458. kobject_uevent(&efd->dev->kobj, KOBJ_CHANGE);
  459. return 1;
  460. }
  461. return 0;
  462. }
  463. #define INIT_ALLOC_SIZE 32
  464. static void ses_enclosure_data_process(struct enclosure_device *edev,
  465. struct scsi_device *sdev,
  466. int create)
  467. {
  468. u32 result;
  469. unsigned char *buf = NULL, *type_ptr, *desc_ptr, *addl_desc_ptr = NULL;
  470. int i, j, page7_len, len, components;
  471. struct ses_device *ses_dev = edev->scratch;
  472. int types = ses_dev->page1_num_types;
  473. unsigned char *hdr_buf = kzalloc(INIT_ALLOC_SIZE, GFP_KERNEL);
  474. if (!hdr_buf)
  475. goto simple_populate;
  476. /* re-read page 10 */
  477. if (ses_dev->page10)
  478. ses_recv_diag(sdev, 10, ses_dev->page10, ses_dev->page10_len);
  479. /* Page 7 for the descriptors is optional */
  480. result = ses_recv_diag(sdev, 7, hdr_buf, INIT_ALLOC_SIZE);
  481. if (result)
  482. goto simple_populate;
  483. page7_len = len = (hdr_buf[2] << 8) + hdr_buf[3] + 4;
  484. /* add 1 for trailing '\0' we'll use */
  485. buf = kzalloc(len + 1, GFP_KERNEL);
  486. if (!buf)
  487. goto simple_populate;
  488. result = ses_recv_diag(sdev, 7, buf, len);
  489. if (result) {
  490. simple_populate:
  491. kfree(buf);
  492. buf = NULL;
  493. desc_ptr = NULL;
  494. len = 0;
  495. page7_len = 0;
  496. } else {
  497. desc_ptr = buf + 8;
  498. len = (desc_ptr[2] << 8) + desc_ptr[3];
  499. /* skip past overall descriptor */
  500. desc_ptr += len + 4;
  501. }
  502. if (ses_dev->page10 && ses_dev->page10_len > 9)
  503. addl_desc_ptr = ses_dev->page10 + 8;
  504. type_ptr = ses_dev->page1_types;
  505. components = 0;
  506. for (i = 0; i < types; i++, type_ptr += 4) {
  507. for (j = 0; j < type_ptr[1]; j++) {
  508. char *name = NULL;
  509. struct enclosure_component *ecomp;
  510. int max_desc_len;
  511. if (desc_ptr) {
  512. if (desc_ptr + 3 >= buf + page7_len) {
  513. desc_ptr = NULL;
  514. } else {
  515. len = (desc_ptr[2] << 8) + desc_ptr[3];
  516. desc_ptr += 4;
  517. if (desc_ptr + len > buf + page7_len)
  518. desc_ptr = NULL;
  519. else {
  520. /* Add trailing zero - pushes into
  521. * reserved space */
  522. desc_ptr[len] = '\0';
  523. name = desc_ptr;
  524. }
  525. }
  526. }
  527. if (type_ptr[0] == ENCLOSURE_COMPONENT_DEVICE ||
  528. type_ptr[0] == ENCLOSURE_COMPONENT_ARRAY_DEVICE) {
  529. if (create)
  530. ecomp = enclosure_component_alloc(
  531. edev,
  532. components++,
  533. type_ptr[0],
  534. name);
  535. else if (components < edev->components)
  536. ecomp = &edev->component[components++];
  537. else
  538. ecomp = ERR_PTR(-EINVAL);
  539. if (!IS_ERR(ecomp)) {
  540. if (addl_desc_ptr) {
  541. max_desc_len = ses_dev->page10_len -
  542. (addl_desc_ptr - ses_dev->page10);
  543. if (ses_process_descriptor(ecomp,
  544. addl_desc_ptr,
  545. max_desc_len))
  546. addl_desc_ptr = NULL;
  547. }
  548. if (create)
  549. enclosure_component_register(
  550. ecomp);
  551. }
  552. }
  553. if (desc_ptr)
  554. desc_ptr += len;
  555. if (addl_desc_ptr &&
  556. /* only find additional descriptions for specific devices */
  557. (type_ptr[0] == ENCLOSURE_COMPONENT_DEVICE ||
  558. type_ptr[0] == ENCLOSURE_COMPONENT_ARRAY_DEVICE ||
  559. type_ptr[0] == ENCLOSURE_COMPONENT_SAS_EXPANDER ||
  560. /* these elements are optional */
  561. type_ptr[0] == ENCLOSURE_COMPONENT_SCSI_TARGET_PORT ||
  562. type_ptr[0] == ENCLOSURE_COMPONENT_SCSI_INITIATOR_PORT ||
  563. type_ptr[0] == ENCLOSURE_COMPONENT_CONTROLLER_ELECTRONICS)) {
  564. addl_desc_ptr += addl_desc_ptr[1] + 2;
  565. if (addl_desc_ptr + 1 >= ses_dev->page10 + ses_dev->page10_len)
  566. addl_desc_ptr = NULL;
  567. }
  568. }
  569. }
  570. kfree(buf);
  571. kfree(hdr_buf);
  572. }
  573. static void ses_match_to_enclosure(struct enclosure_device *edev,
  574. struct scsi_device *sdev,
  575. int refresh)
  576. {
  577. struct scsi_device *edev_sdev = to_scsi_device(edev->edev.parent);
  578. struct efd efd = {
  579. .addr = 0,
  580. };
  581. if (refresh)
  582. ses_enclosure_data_process(edev, edev_sdev, 0);
  583. if (scsi_is_sas_rphy(sdev->sdev_target->dev.parent))
  584. efd.addr = sas_get_address(sdev);
  585. if (efd.addr) {
  586. efd.dev = &sdev->sdev_gendev;
  587. ses_enclosure_find_by_addr(edev, &efd);
  588. }
  589. }
  590. static int ses_intf_add(struct device *cdev)
  591. {
  592. struct scsi_device *sdev = to_scsi_device(cdev->parent);
  593. struct scsi_device *tmp_sdev;
  594. unsigned char *buf = NULL, *hdr_buf, *type_ptr, page;
  595. struct ses_device *ses_dev;
  596. u32 result;
  597. int i, types, len, components = 0;
  598. int err = -ENOMEM;
  599. int num_enclosures;
  600. struct enclosure_device *edev;
  601. struct ses_component *scomp = NULL;
  602. if (!scsi_device_enclosure(sdev)) {
  603. /* not an enclosure, but might be in one */
  604. struct enclosure_device *prev = NULL;
  605. while ((edev = enclosure_find(&sdev->host->shost_gendev, prev)) != NULL) {
  606. ses_match_to_enclosure(edev, sdev, 1);
  607. prev = edev;
  608. }
  609. return -ENODEV;
  610. }
  611. /* TYPE_ENCLOSURE prints a message in probe */
  612. if (sdev->type != TYPE_ENCLOSURE)
  613. sdev_printk(KERN_NOTICE, sdev, "Embedded Enclosure Device\n");
  614. ses_dev = kzalloc_obj(*ses_dev);
  615. hdr_buf = kzalloc(INIT_ALLOC_SIZE, GFP_KERNEL);
  616. if (!hdr_buf || !ses_dev)
  617. goto err_init_free;
  618. page = 1;
  619. result = ses_recv_diag(sdev, page, hdr_buf, INIT_ALLOC_SIZE);
  620. if (result)
  621. goto recv_failed;
  622. len = (hdr_buf[2] << 8) + hdr_buf[3] + 4;
  623. buf = kzalloc(len, GFP_KERNEL);
  624. if (!buf)
  625. goto err_free;
  626. result = ses_recv_diag(sdev, page, buf, len);
  627. if (result)
  628. goto recv_failed;
  629. types = 0;
  630. /* we always have one main enclosure and the rest are referred
  631. * to as secondary subenclosures */
  632. num_enclosures = buf[1] + 1;
  633. /* begin at the enclosure descriptor */
  634. type_ptr = buf + 8;
  635. /* skip all the enclosure descriptors */
  636. for (i = 0; i < num_enclosures && type_ptr < buf + len; i++) {
  637. types += type_ptr[2];
  638. type_ptr += type_ptr[3] + 4;
  639. }
  640. ses_dev->page1_types = type_ptr;
  641. ses_dev->page1_num_types = types;
  642. for (i = 0; i < types && type_ptr < buf + len; i++, type_ptr += 4) {
  643. if (type_ptr[0] == ENCLOSURE_COMPONENT_DEVICE ||
  644. type_ptr[0] == ENCLOSURE_COMPONENT_ARRAY_DEVICE)
  645. components += type_ptr[1];
  646. }
  647. ses_dev->page1 = buf;
  648. ses_dev->page1_len = len;
  649. buf = NULL;
  650. page = 2;
  651. result = ses_recv_diag(sdev, page, hdr_buf, INIT_ALLOC_SIZE);
  652. if (result)
  653. goto page2_not_supported;
  654. len = (hdr_buf[2] << 8) + hdr_buf[3] + 4;
  655. buf = kzalloc(len, GFP_KERNEL);
  656. if (!buf)
  657. goto err_free;
  658. /* make sure getting page 2 actually works */
  659. result = ses_recv_diag(sdev, 2, buf, len);
  660. if (result)
  661. goto recv_failed;
  662. ses_dev->page2 = buf;
  663. ses_dev->page2_len = len;
  664. buf = NULL;
  665. /* The additional information page --- allows us
  666. * to match up the devices */
  667. page = 10;
  668. result = ses_recv_diag(sdev, page, hdr_buf, INIT_ALLOC_SIZE);
  669. if (!result) {
  670. len = (hdr_buf[2] << 8) + hdr_buf[3] + 4;
  671. buf = kzalloc(len, GFP_KERNEL);
  672. if (!buf)
  673. goto err_free;
  674. result = ses_recv_diag(sdev, page, buf, len);
  675. if (result)
  676. goto recv_failed;
  677. ses_dev->page10 = buf;
  678. ses_dev->page10_len = len;
  679. buf = NULL;
  680. }
  681. page2_not_supported:
  682. if (components > 0) {
  683. scomp = kzalloc_objs(struct ses_component, components);
  684. if (!scomp)
  685. goto err_free;
  686. }
  687. edev = enclosure_register(cdev->parent, dev_name(&sdev->sdev_gendev),
  688. components, &ses_enclosure_callbacks);
  689. if (IS_ERR(edev)) {
  690. err = PTR_ERR(edev);
  691. goto err_free;
  692. }
  693. kfree(hdr_buf);
  694. edev->scratch = ses_dev;
  695. for (i = 0; i < components; i++)
  696. edev->component[i].scratch = scomp + i;
  697. ses_enclosure_data_process(edev, sdev, 1);
  698. /* see if there are any devices matching before
  699. * we found the enclosure */
  700. shost_for_each_device(tmp_sdev, sdev->host) {
  701. if (tmp_sdev->lun != 0 || scsi_device_enclosure(tmp_sdev))
  702. continue;
  703. ses_match_to_enclosure(edev, tmp_sdev, 0);
  704. }
  705. return 0;
  706. recv_failed:
  707. sdev_printk(KERN_ERR, sdev, "Failed to get diagnostic page 0x%x\n",
  708. page);
  709. err = -ENODEV;
  710. err_free:
  711. kfree(buf);
  712. kfree(scomp);
  713. kfree(ses_dev->page10);
  714. kfree(ses_dev->page2);
  715. kfree(ses_dev->page1);
  716. err_init_free:
  717. kfree(ses_dev);
  718. kfree(hdr_buf);
  719. sdev_printk(KERN_ERR, sdev, "Failed to bind enclosure %d\n", err);
  720. return err;
  721. }
  722. static void ses_intf_remove_component(struct scsi_device *sdev)
  723. {
  724. struct enclosure_device *edev, *prev = NULL;
  725. while ((edev = enclosure_find(&sdev->host->shost_gendev, prev)) != NULL) {
  726. prev = edev;
  727. if (!enclosure_remove_device(edev, &sdev->sdev_gendev))
  728. break;
  729. }
  730. if (edev)
  731. put_device(&edev->edev);
  732. }
  733. static void ses_intf_remove_enclosure(struct scsi_device *sdev)
  734. {
  735. struct enclosure_device *edev;
  736. struct ses_device *ses_dev;
  737. /* exact match to this enclosure */
  738. edev = enclosure_find(&sdev->sdev_gendev, NULL);
  739. if (!edev)
  740. return;
  741. ses_dev = edev->scratch;
  742. edev->scratch = NULL;
  743. kfree(ses_dev->page10);
  744. kfree(ses_dev->page1);
  745. kfree(ses_dev->page2);
  746. kfree(ses_dev);
  747. if (edev->components)
  748. kfree(edev->component[0].scratch);
  749. put_device(&edev->edev);
  750. enclosure_unregister(edev);
  751. }
  752. static void ses_intf_remove(struct device *cdev)
  753. {
  754. struct scsi_device *sdev = to_scsi_device(cdev->parent);
  755. if (!scsi_device_enclosure(sdev))
  756. ses_intf_remove_component(sdev);
  757. else
  758. ses_intf_remove_enclosure(sdev);
  759. }
  760. static struct class_interface ses_interface = {
  761. .add_dev = ses_intf_add,
  762. .remove_dev = ses_intf_remove,
  763. };
  764. static struct scsi_driver ses_template = {
  765. .probe = ses_probe,
  766. .gendrv = {
  767. .name = "ses",
  768. },
  769. };
  770. static int __init ses_init(void)
  771. {
  772. int err;
  773. err = scsi_register_interface(&ses_interface);
  774. if (err)
  775. return err;
  776. err = scsi_register_driver(&ses_template);
  777. if (err)
  778. goto out_unreg;
  779. return 0;
  780. out_unreg:
  781. scsi_unregister_interface(&ses_interface);
  782. return err;
  783. }
  784. static void __exit ses_exit(void)
  785. {
  786. scsi_unregister_driver(&ses_template);
  787. scsi_unregister_interface(&ses_interface);
  788. }
  789. module_init(ses_init);
  790. module_exit(ses_exit);
  791. MODULE_ALIAS_SCSI_DEVICE(TYPE_ENCLOSURE);
  792. MODULE_AUTHOR("James Bottomley");
  793. MODULE_DESCRIPTION("SCSI Enclosure Services (ses) driver");
  794. MODULE_LICENSE("GPL v2");