You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

scsi.c 28KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004
  1. /*
  2. * Copyright (C) 2006 Michael Brown <mbrown@fensystems.co.uk>.
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public License as
  6. * published by the Free Software Foundation; either version 2 of the
  7. * License, or any later version.
  8. *
  9. * This program is distributed in the hope that it will be useful, but
  10. * WITHOUT ANY WARRANTY; without even the implied warranty of
  11. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  12. * General Public License for more details.
  13. *
  14. * You should have received a copy of the GNU General Public License
  15. * along with this program; if not, write to the Free Software
  16. * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
  17. * 02110-1301, USA.
  18. *
  19. * You can also choose to distribute this program under the terms of
  20. * the Unmodified Binary Distribution Licence (as given in the file
  21. * COPYING.UBDL), provided that you have satisfied its requirements.
  22. */
  23. FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
  24. #include <stddef.h>
  25. #include <stdlib.h>
  26. #include <string.h>
  27. #include <byteswap.h>
  28. #include <errno.h>
  29. #include <ipxe/list.h>
  30. #include <ipxe/process.h>
  31. #include <ipxe/xfer.h>
  32. #include <ipxe/blockdev.h>
  33. #include <ipxe/scsi.h>
  34. /** @file
  35. *
  36. * SCSI block device
  37. *
  38. */
  39. /** Maximum number of TEST UNIT READY retries */
  40. #define SCSI_READY_MAX_RETRIES 10
  41. /* Error numbers generated by SCSI sense data */
  42. #define EIO_NO_SENSE __einfo_error ( EINFO_EIO_NO_SENSE )
  43. #define EINFO_EIO_NO_SENSE \
  44. __einfo_uniqify ( EINFO_EIO, 0x00, "No sense" )
  45. #define EIO_RECOVERED_ERROR __einfo_error ( EINFO_EIO_RECOVERED_ERROR )
  46. #define EINFO_EIO_RECOVERED_ERROR \
  47. __einfo_uniqify ( EINFO_EIO, 0x01, "Recovered error" )
  48. #define EIO_NOT_READY __einfo_error ( EINFO_EIO_NOT_READY )
  49. #define EINFO_EIO_NOT_READY \
  50. __einfo_uniqify ( EINFO_EIO, 0x02, "Not ready" )
  51. #define EIO_MEDIUM_ERROR __einfo_error ( EINFO_EIO_MEDIUM_ERROR )
  52. #define EINFO_EIO_MEDIUM_ERROR \
  53. __einfo_uniqify ( EINFO_EIO, 0x03, "Medium error" )
  54. #define EIO_HARDWARE_ERROR __einfo_error ( EINFO_EIO_HARDWARE_ERROR )
  55. #define EINFO_EIO_HARDWARE_ERROR \
  56. __einfo_uniqify ( EINFO_EIO, 0x04, "Hardware error" )
  57. #define EIO_ILLEGAL_REQUEST __einfo_error ( EINFO_EIO_ILLEGAL_REQUEST )
  58. #define EINFO_EIO_ILLEGAL_REQUEST \
  59. __einfo_uniqify ( EINFO_EIO, 0x05, "Illegal request" )
  60. #define EIO_UNIT_ATTENTION __einfo_error ( EINFO_EIO_UNIT_ATTENTION )
  61. #define EINFO_EIO_UNIT_ATTENTION \
  62. __einfo_uniqify ( EINFO_EIO, 0x06, "Unit attention" )
  63. #define EIO_DATA_PROTECT __einfo_error ( EINFO_EIO_DATA_PROTECT )
  64. #define EINFO_EIO_DATA_PROTECT \
  65. __einfo_uniqify ( EINFO_EIO, 0x07, "Data protect" )
  66. #define EIO_BLANK_CHECK __einfo_error ( EINFO_EIO_BLANK_CHECK )
  67. #define EINFO_EIO_BLANK_CHECK \
  68. __einfo_uniqify ( EINFO_EIO, 0x08, "Blank check" )
  69. #define EIO_VENDOR_SPECIFIC __einfo_error ( EINFO_EIO_VENDOR_SPECIFIC )
  70. #define EINFO_EIO_VENDOR_SPECIFIC \
  71. __einfo_uniqify ( EINFO_EIO, 0x09, "Vendor specific" )
  72. #define EIO_COPY_ABORTED __einfo_error ( EINFO_EIO_COPY_ABORTED )
  73. #define EINFO_EIO_COPY_ABORTED \
  74. __einfo_uniqify ( EINFO_EIO, 0x0a, "Copy aborted" )
  75. #define EIO_ABORTED_COMMAND __einfo_error ( EINFO_EIO_ABORTED_COMMAND )
  76. #define EINFO_EIO_ABORTED_COMMAND \
  77. __einfo_uniqify ( EINFO_EIO, 0x0b, "Aborted command" )
  78. #define EIO_RESERVED __einfo_error ( EINFO_EIO_RESERVED )
  79. #define EINFO_EIO_RESERVED \
  80. __einfo_uniqify ( EINFO_EIO, 0x0c, "Reserved" )
  81. #define EIO_VOLUME_OVERFLOW __einfo_error ( EINFO_EIO_VOLUME_OVERFLOW )
  82. #define EINFO_EIO_VOLUME_OVERFLOW \
  83. __einfo_uniqify ( EINFO_EIO, 0x0d, "Volume overflow" )
  84. #define EIO_MISCOMPARE __einfo_error ( EINFO_EIO_MISCOMPARE )
  85. #define EINFO_EIO_MISCOMPARE \
  86. __einfo_uniqify ( EINFO_EIO, 0x0e, "Miscompare" )
  87. #define EIO_COMPLETED __einfo_error ( EINFO_EIO_COMPLETED )
  88. #define EINFO_EIO_COMPLETED \
  89. __einfo_uniqify ( EINFO_EIO, 0x0f, "Completed" )
  90. #define EIO_SENSE( key ) \
  91. EUNIQ ( EINFO_EIO, (key), EIO_NO_SENSE, EIO_RECOVERED_ERROR, \
  92. EIO_NOT_READY, EIO_MEDIUM_ERROR, EIO_HARDWARE_ERROR, \
  93. EIO_ILLEGAL_REQUEST, EIO_UNIT_ATTENTION, \
  94. EIO_DATA_PROTECT, EIO_BLANK_CHECK, EIO_VENDOR_SPECIFIC, \
  95. EIO_COPY_ABORTED, EIO_ABORTED_COMMAND, EIO_RESERVED, \
  96. EIO_VOLUME_OVERFLOW, EIO_MISCOMPARE, EIO_COMPLETED )
  97. /******************************************************************************
  98. *
  99. * Utility functions
  100. *
  101. ******************************************************************************
  102. */
  103. /**
  104. * Parse SCSI LUN
  105. *
  106. * @v lun_string LUN string representation
  107. * @v lun LUN to fill in
  108. * @ret rc Return status code
  109. */
  110. int scsi_parse_lun ( const char *lun_string, struct scsi_lun *lun ) {
  111. char *p;
  112. int i;
  113. memset ( lun, 0, sizeof ( *lun ) );
  114. if ( lun_string ) {
  115. p = ( char * ) lun_string;
  116. for ( i = 0 ; i < 4 ; i++ ) {
  117. lun->u16[i] = htons ( strtoul ( p, &p, 16 ) );
  118. if ( *p == '\0' )
  119. break;
  120. if ( *p != '-' )
  121. return -EINVAL;
  122. p++;
  123. }
  124. if ( *p )
  125. return -EINVAL;
  126. }
  127. return 0;
  128. }
  129. /**
  130. * Parse SCSI sense data
  131. *
  132. * @v data Raw sense data
  133. * @v len Length of raw sense data
  134. * @v sense Descriptor-format sense data to fill in
  135. */
  136. void scsi_parse_sense ( const void *data, size_t len,
  137. struct scsi_sns_descriptor *sense ) {
  138. const union scsi_sns *sns = data;
  139. /* Avoid returning uninitialised data */
  140. memset ( sense, 0, sizeof ( *sense ) );
  141. /* Copy, assuming descriptor-format data */
  142. if ( len < sizeof ( sns->desc ) )
  143. return;
  144. memcpy ( sense, &sns->desc, sizeof ( *sense ) );
  145. /* Convert fixed-format to descriptor-format, if applicable */
  146. if ( len < sizeof ( sns->fixed ) )
  147. return;
  148. if ( ! SCSI_SENSE_FIXED ( sns->code ) )
  149. return;
  150. sense->additional = sns->fixed.additional;
  151. }
  152. /******************************************************************************
  153. *
  154. * Interface methods
  155. *
  156. ******************************************************************************
  157. */
  158. /**
  159. * Issue SCSI command
  160. *
  161. * @v control SCSI control interface
  162. * @v data SCSI data interface
  163. * @v command SCSI command
  164. * @ret tag Command tag, or negative error
  165. */
  166. int scsi_command ( struct interface *control, struct interface *data,
  167. struct scsi_cmd *command ) {
  168. struct interface *dest;
  169. scsi_command_TYPE ( void * ) *op =
  170. intf_get_dest_op ( control, scsi_command, &dest );
  171. void *object = intf_object ( dest );
  172. int tap;
  173. if ( op ) {
  174. tap = op ( object, data, command );
  175. } else {
  176. /* Default is to fail to issue the command */
  177. tap = -EOPNOTSUPP;
  178. }
  179. intf_put ( dest );
  180. return tap;
  181. }
  182. /**
  183. * Report SCSI response
  184. *
  185. * @v interface SCSI command interface
  186. * @v response SCSI response
  187. */
  188. void scsi_response ( struct interface *intf, struct scsi_rsp *response ) {
  189. struct interface *dest;
  190. scsi_response_TYPE ( void * ) *op =
  191. intf_get_dest_op ( intf, scsi_response, &dest );
  192. void *object = intf_object ( dest );
  193. if ( op ) {
  194. op ( object, response );
  195. } else {
  196. /* Default is to ignore the response */
  197. }
  198. intf_put ( dest );
  199. }
  200. /******************************************************************************
  201. *
  202. * SCSI devices and commands
  203. *
  204. ******************************************************************************
  205. */
  206. /** A SCSI device */
  207. struct scsi_device {
  208. /** Reference count */
  209. struct refcnt refcnt;
  210. /** Block control interface */
  211. struct interface block;
  212. /** SCSI control interface */
  213. struct interface scsi;
  214. /** SCSI LUN */
  215. struct scsi_lun lun;
  216. /** Flags */
  217. unsigned int flags;
  218. /** TEST UNIT READY interface */
  219. struct interface ready;
  220. /** TEST UNIT READY process */
  221. struct process process;
  222. /** TEST UNIT READY retry count */
  223. unsigned int retries;
  224. /** List of commands */
  225. struct list_head cmds;
  226. };
  227. /** SCSI device flags */
  228. enum scsi_device_flags {
  229. /** TEST UNIT READY has been issued */
  230. SCSIDEV_UNIT_TESTED = 0x0001,
  231. /** TEST UNIT READY has completed successfully */
  232. SCSIDEV_UNIT_READY = 0x0002,
  233. };
  234. /** A SCSI command */
  235. struct scsi_command {
  236. /** Reference count */
  237. struct refcnt refcnt;
  238. /** SCSI device */
  239. struct scsi_device *scsidev;
  240. /** List of SCSI commands */
  241. struct list_head list;
  242. /** Block data interface */
  243. struct interface block;
  244. /** SCSI data interface */
  245. struct interface scsi;
  246. /** Command type */
  247. struct scsi_command_type *type;
  248. /** Starting logical block address */
  249. uint64_t lba;
  250. /** Number of blocks */
  251. unsigned int count;
  252. /** Data buffer */
  253. userptr_t buffer;
  254. /** Length of data buffer */
  255. size_t len;
  256. /** Command tag */
  257. uint32_t tag;
  258. /** Private data */
  259. uint8_t priv[0];
  260. };
  261. /** A SCSI command type */
  262. struct scsi_command_type {
  263. /** Name */
  264. const char *name;
  265. /** Additional working space */
  266. size_t priv_len;
  267. /**
  268. * Construct SCSI command IU
  269. *
  270. * @v scsicmd SCSI command
  271. * @v command SCSI command IU
  272. */
  273. void ( * cmd ) ( struct scsi_command *scsicmd,
  274. struct scsi_cmd *command );
  275. /**
  276. * Handle SCSI command completion
  277. *
  278. * @v scsicmd SCSI command
  279. * @v rc Reason for completion
  280. */
  281. void ( * done ) ( struct scsi_command *scsicmd, int rc );
  282. };
  283. /**
  284. * Get reference to SCSI device
  285. *
  286. * @v scsidev SCSI device
  287. * @ret scsidev SCSI device
  288. */
  289. static inline __attribute__ (( always_inline )) struct scsi_device *
  290. scsidev_get ( struct scsi_device *scsidev ) {
  291. ref_get ( &scsidev->refcnt );
  292. return scsidev;
  293. }
  294. /**
  295. * Drop reference to SCSI device
  296. *
  297. * @v scsidev SCSI device
  298. */
  299. static inline __attribute__ (( always_inline )) void
  300. scsidev_put ( struct scsi_device *scsidev ) {
  301. ref_put ( &scsidev->refcnt );
  302. }
  303. /**
  304. * Get reference to SCSI command
  305. *
  306. * @v scsicmd SCSI command
  307. * @ret scsicmd SCSI command
  308. */
  309. static inline __attribute__ (( always_inline )) struct scsi_command *
  310. scsicmd_get ( struct scsi_command *scsicmd ) {
  311. ref_get ( &scsicmd->refcnt );
  312. return scsicmd;
  313. }
  314. /**
  315. * Drop reference to SCSI command
  316. *
  317. * @v scsicmd SCSI command
  318. */
  319. static inline __attribute__ (( always_inline )) void
  320. scsicmd_put ( struct scsi_command *scsicmd ) {
  321. ref_put ( &scsicmd->refcnt );
  322. }
  323. /**
  324. * Get SCSI command private data
  325. *
  326. * @v scsicmd SCSI command
  327. * @ret priv Private data
  328. */
  329. static inline __attribute__ (( always_inline )) void *
  330. scsicmd_priv ( struct scsi_command *scsicmd ) {
  331. return scsicmd->priv;
  332. }
  333. /**
  334. * Free SCSI command
  335. *
  336. * @v refcnt Reference count
  337. */
  338. static void scsicmd_free ( struct refcnt *refcnt ) {
  339. struct scsi_command *scsicmd =
  340. container_of ( refcnt, struct scsi_command, refcnt );
  341. /* Drop reference to SCSI device */
  342. scsidev_put ( scsicmd->scsidev );
  343. /* Free command */
  344. free ( scsicmd );
  345. }
  346. /**
  347. * Close SCSI command
  348. *
  349. * @v scsicmd SCSI command
  350. * @v rc Reason for close
  351. */
  352. static void scsicmd_close ( struct scsi_command *scsicmd, int rc ) {
  353. struct scsi_device *scsidev = scsicmd->scsidev;
  354. if ( rc != 0 ) {
  355. DBGC ( scsidev, "SCSI %p tag %08x closed: %s\n",
  356. scsidev, scsicmd->tag, strerror ( rc ) );
  357. }
  358. /* Remove from list of commands */
  359. list_del ( &scsicmd->list );
  360. /* Shut down interfaces */
  361. intfs_shutdown ( rc, &scsicmd->scsi, &scsicmd->block, NULL );
  362. /* Drop list's reference */
  363. scsicmd_put ( scsicmd );
  364. }
  365. /**
  366. * Construct and issue SCSI command
  367. *
  368. * @ret rc Return status code
  369. */
  370. static int scsicmd_command ( struct scsi_command *scsicmd ) {
  371. struct scsi_device *scsidev = scsicmd->scsidev;
  372. struct scsi_cmd command;
  373. int tag;
  374. int rc;
  375. /* Construct command */
  376. memset ( &command, 0, sizeof ( command ) );
  377. memcpy ( &command.lun, &scsidev->lun, sizeof ( command.lun ) );
  378. scsicmd->type->cmd ( scsicmd, &command );
  379. /* Issue command */
  380. if ( ( tag = scsi_command ( &scsidev->scsi, &scsicmd->scsi,
  381. &command ) ) < 0 ) {
  382. rc = tag;
  383. DBGC ( scsidev, "SCSI %p could not issue command: %s\n",
  384. scsidev, strerror ( rc ) );
  385. return rc;
  386. }
  387. /* Record tag */
  388. if ( scsicmd->tag ) {
  389. DBGC ( scsidev, "SCSI %p tag %08x is now tag %08x\n",
  390. scsidev, scsicmd->tag, tag );
  391. }
  392. scsicmd->tag = tag;
  393. DBGC2 ( scsidev, "SCSI %p tag %08x %s " SCSI_CDB_FORMAT "\n",
  394. scsidev, scsicmd->tag, scsicmd->type->name,
  395. SCSI_CDB_DATA ( command.cdb ) );
  396. return 0;
  397. }
  398. /**
  399. * Handle SCSI command completion
  400. *
  401. * @v scsicmd SCSI command
  402. * @v rc Reason for close
  403. */
  404. static void scsicmd_done ( struct scsi_command *scsicmd, int rc ) {
  405. /* Restart SCSI interface */
  406. intf_restart ( &scsicmd->scsi, rc );
  407. /* Hand over to the command completion handler */
  408. scsicmd->type->done ( scsicmd, rc );
  409. }
  410. /**
  411. * Handle SCSI response
  412. *
  413. * @v scsicmd SCSI command
  414. * @v response SCSI response
  415. */
  416. static void scsicmd_response ( struct scsi_command *scsicmd,
  417. struct scsi_rsp *response ) {
  418. struct scsi_device *scsidev = scsicmd->scsidev;
  419. size_t overrun;
  420. size_t underrun;
  421. int rc;
  422. if ( response->status == 0 ) {
  423. scsicmd_done ( scsicmd, 0 );
  424. } else {
  425. DBGC ( scsidev, "SCSI %p tag %08x status %02x",
  426. scsidev, scsicmd->tag, response->status );
  427. if ( response->overrun > 0 ) {
  428. overrun = response->overrun;
  429. DBGC ( scsidev, " overrun +%zd", overrun );
  430. } else if ( response->overrun < 0 ) {
  431. underrun = -(response->overrun);
  432. DBGC ( scsidev, " underrun -%zd", underrun );
  433. }
  434. DBGC ( scsidev, " sense %02x key %02x additional %04x\n",
  435. ( response->sense.code & SCSI_SENSE_CODE_MASK ),
  436. ( response->sense.key & SCSI_SENSE_KEY_MASK ),
  437. ntohs ( response->sense.additional ) );
  438. /* Construct error number from sense data */
  439. rc = -EIO_SENSE ( response->sense.key & SCSI_SENSE_KEY_MASK );
  440. scsicmd_done ( scsicmd, rc );
  441. }
  442. }
  443. /**
  444. * Construct SCSI READ command
  445. *
  446. * @v scsicmd SCSI command
  447. * @v command SCSI command IU
  448. */
  449. static void scsicmd_read_cmd ( struct scsi_command *scsicmd,
  450. struct scsi_cmd *command ) {
  451. if ( ( scsicmd->lba + scsicmd->count ) > SCSI_MAX_BLOCK_10 ) {
  452. /* Use READ (16) */
  453. command->cdb.read16.opcode = SCSI_OPCODE_READ_16;
  454. command->cdb.read16.lba = cpu_to_be64 ( scsicmd->lba );
  455. command->cdb.read16.len = cpu_to_be32 ( scsicmd->count );
  456. } else {
  457. /* Use READ (10) */
  458. command->cdb.read10.opcode = SCSI_OPCODE_READ_10;
  459. command->cdb.read10.lba = cpu_to_be32 ( scsicmd->lba );
  460. command->cdb.read10.len = cpu_to_be16 ( scsicmd->count );
  461. }
  462. command->data_in = scsicmd->buffer;
  463. command->data_in_len = scsicmd->len;
  464. }
  465. /** SCSI READ command type */
  466. static struct scsi_command_type scsicmd_read = {
  467. .name = "READ",
  468. .cmd = scsicmd_read_cmd,
  469. .done = scsicmd_close,
  470. };
  471. /**
  472. * Construct SCSI WRITE command
  473. *
  474. * @v scsicmd SCSI command
  475. * @v command SCSI command IU
  476. */
  477. static void scsicmd_write_cmd ( struct scsi_command *scsicmd,
  478. struct scsi_cmd *command ) {
  479. if ( ( scsicmd->lba + scsicmd->count ) > SCSI_MAX_BLOCK_10 ) {
  480. /* Use WRITE (16) */
  481. command->cdb.write16.opcode = SCSI_OPCODE_WRITE_16;
  482. command->cdb.write16.lba = cpu_to_be64 ( scsicmd->lba );
  483. command->cdb.write16.len = cpu_to_be32 ( scsicmd->count );
  484. } else {
  485. /* Use WRITE (10) */
  486. command->cdb.write10.opcode = SCSI_OPCODE_WRITE_10;
  487. command->cdb.write10.lba = cpu_to_be32 ( scsicmd->lba );
  488. command->cdb.write10.len = cpu_to_be16 ( scsicmd->count );
  489. }
  490. command->data_out = scsicmd->buffer;
  491. command->data_out_len = scsicmd->len;
  492. }
  493. /** SCSI WRITE command type */
  494. static struct scsi_command_type scsicmd_write = {
  495. .name = "WRITE",
  496. .cmd = scsicmd_write_cmd,
  497. .done = scsicmd_close,
  498. };
  499. /** SCSI READ CAPACITY private data */
  500. struct scsi_read_capacity_private {
  501. /** Use READ CAPACITY (16) */
  502. int use16;
  503. /** Data buffer for READ CAPACITY commands */
  504. union {
  505. /** Data buffer for READ CAPACITY (10) */
  506. struct scsi_capacity_10 capacity10;
  507. /** Data buffer for READ CAPACITY (16) */
  508. struct scsi_capacity_16 capacity16;
  509. } capacity;
  510. };
  511. /**
  512. * Construct SCSI READ CAPACITY command
  513. *
  514. * @v scsicmd SCSI command
  515. * @v command SCSI command IU
  516. */
  517. static void scsicmd_read_capacity_cmd ( struct scsi_command *scsicmd,
  518. struct scsi_cmd *command ) {
  519. struct scsi_read_capacity_private *priv = scsicmd_priv ( scsicmd );
  520. struct scsi_cdb_read_capacity_16 *readcap16 = &command->cdb.readcap16;
  521. struct scsi_cdb_read_capacity_10 *readcap10 = &command->cdb.readcap10;
  522. struct scsi_capacity_16 *capacity16 = &priv->capacity.capacity16;
  523. struct scsi_capacity_10 *capacity10 = &priv->capacity.capacity10;
  524. if ( priv->use16 ) {
  525. /* Use READ CAPACITY (16) */
  526. readcap16->opcode = SCSI_OPCODE_SERVICE_ACTION_IN;
  527. readcap16->service_action =
  528. SCSI_SERVICE_ACTION_READ_CAPACITY_16;
  529. readcap16->len = cpu_to_be32 ( sizeof ( *capacity16 ) );
  530. command->data_in = virt_to_user ( capacity16 );
  531. command->data_in_len = sizeof ( *capacity16 );
  532. } else {
  533. /* Use READ CAPACITY (10) */
  534. readcap10->opcode = SCSI_OPCODE_READ_CAPACITY_10;
  535. command->data_in = virt_to_user ( capacity10 );
  536. command->data_in_len = sizeof ( *capacity10 );
  537. }
  538. }
  539. /**
  540. * Handle SCSI READ CAPACITY command completion
  541. *
  542. * @v scsicmd SCSI command
  543. * @v rc Reason for completion
  544. */
  545. static void scsicmd_read_capacity_done ( struct scsi_command *scsicmd,
  546. int rc ) {
  547. struct scsi_read_capacity_private *priv = scsicmd_priv ( scsicmd );
  548. struct scsi_capacity_16 *capacity16 = &priv->capacity.capacity16;
  549. struct scsi_capacity_10 *capacity10 = &priv->capacity.capacity10;
  550. struct block_device_capacity capacity;
  551. /* Close if command failed */
  552. if ( rc != 0 ) {
  553. scsicmd_close ( scsicmd, rc );
  554. return;
  555. }
  556. /* Extract capacity */
  557. if ( priv->use16 ) {
  558. capacity.blocks = ( be64_to_cpu ( capacity16->lba ) + 1 );
  559. capacity.blksize = be32_to_cpu ( capacity16->blksize );
  560. } else {
  561. capacity.blocks = ( be32_to_cpu ( capacity10->lba ) + 1 );
  562. capacity.blksize = be32_to_cpu ( capacity10->blksize );
  563. /* If capacity range was exceeded (i.e. capacity.lba
  564. * was 0xffffffff, meaning that blockdev->blocks is
  565. * now zero), use READ CAPACITY (16) instead. READ
  566. * CAPACITY (16) is not mandatory, so we can't just
  567. * use it straight off.
  568. */
  569. if ( capacity.blocks == 0 ) {
  570. priv->use16 = 1;
  571. if ( ( rc = scsicmd_command ( scsicmd ) ) != 0 ) {
  572. scsicmd_close ( scsicmd, rc );
  573. return;
  574. }
  575. return;
  576. }
  577. }
  578. capacity.max_count = -1U;
  579. /* Return capacity to caller */
  580. block_capacity ( &scsicmd->block, &capacity );
  581. /* Close command */
  582. scsicmd_close ( scsicmd, 0 );
  583. }
  584. /** SCSI READ CAPACITY command type */
  585. static struct scsi_command_type scsicmd_read_capacity = {
  586. .name = "READ CAPACITY",
  587. .priv_len = sizeof ( struct scsi_read_capacity_private ),
  588. .cmd = scsicmd_read_capacity_cmd,
  589. .done = scsicmd_read_capacity_done,
  590. };
  591. /**
  592. * Construct SCSI TEST UNIT READY command
  593. *
  594. * @v scsicmd SCSI command
  595. * @v command SCSI command IU
  596. */
  597. static void scsicmd_test_unit_ready_cmd ( struct scsi_command *scsicmd __unused,
  598. struct scsi_cmd *command ) {
  599. struct scsi_cdb_test_unit_ready *testready = &command->cdb.testready;
  600. testready->opcode = SCSI_OPCODE_TEST_UNIT_READY;
  601. }
  602. /** SCSI TEST UNIT READY command type */
  603. static struct scsi_command_type scsicmd_test_unit_ready = {
  604. .name = "TEST UNIT READY",
  605. .cmd = scsicmd_test_unit_ready_cmd,
  606. .done = scsicmd_close,
  607. };
  608. /** SCSI command block interface operations */
  609. static struct interface_operation scsicmd_block_op[] = {
  610. INTF_OP ( intf_close, struct scsi_command *, scsicmd_close ),
  611. };
  612. /** SCSI command block interface descriptor */
  613. static struct interface_descriptor scsicmd_block_desc =
  614. INTF_DESC_PASSTHRU ( struct scsi_command, block,
  615. scsicmd_block_op, scsi );
  616. /** SCSI command SCSI interface operations */
  617. static struct interface_operation scsicmd_scsi_op[] = {
  618. INTF_OP ( intf_close, struct scsi_command *, scsicmd_done ),
  619. INTF_OP ( scsi_response, struct scsi_command *, scsicmd_response ),
  620. };
  621. /** SCSI command SCSI interface descriptor */
  622. static struct interface_descriptor scsicmd_scsi_desc =
  623. INTF_DESC_PASSTHRU ( struct scsi_command, scsi,
  624. scsicmd_scsi_op, block );
  625. /**
  626. * Create SCSI command
  627. *
  628. * @v scsidev SCSI device
  629. * @v block Block data interface
  630. * @v type SCSI command type
  631. * @v lba Starting logical block address
  632. * @v count Number of blocks to transfer
  633. * @v buffer Data buffer
  634. * @v len Length of data buffer
  635. * @ret rc Return status code
  636. */
  637. static int scsidev_command ( struct scsi_device *scsidev,
  638. struct interface *block,
  639. struct scsi_command_type *type,
  640. uint64_t lba, unsigned int count,
  641. userptr_t buffer, size_t len ) {
  642. struct scsi_command *scsicmd;
  643. int rc;
  644. /* Allocate and initialise structure */
  645. scsicmd = zalloc ( sizeof ( *scsicmd ) + type->priv_len );
  646. if ( ! scsicmd ) {
  647. rc = -ENOMEM;
  648. goto err_zalloc;
  649. }
  650. ref_init ( &scsicmd->refcnt, scsicmd_free );
  651. intf_init ( &scsicmd->block, &scsicmd_block_desc, &scsicmd->refcnt );
  652. intf_init ( &scsicmd->scsi, &scsicmd_scsi_desc,
  653. &scsicmd->refcnt );
  654. scsicmd->scsidev = scsidev_get ( scsidev );
  655. list_add ( &scsicmd->list, &scsidev->cmds );
  656. scsicmd->type = type;
  657. scsicmd->lba = lba;
  658. scsicmd->count = count;
  659. scsicmd->buffer = buffer;
  660. scsicmd->len = len;
  661. /* Issue SCSI command */
  662. if ( ( rc = scsicmd_command ( scsicmd ) ) != 0 )
  663. goto err_command;
  664. /* Attach to parent interface, transfer reference to list, and return */
  665. intf_plug_plug ( &scsicmd->block, block );
  666. return 0;
  667. err_command:
  668. scsicmd_close ( scsicmd, rc );
  669. ref_put ( &scsicmd->refcnt );
  670. err_zalloc:
  671. return rc;
  672. }
  673. /**
  674. * Issue SCSI block read
  675. *
  676. * @v scsidev SCSI device
  677. * @v block Block data interface
  678. * @v lba Starting logical block address
  679. * @v count Number of blocks to transfer
  680. * @v buffer Data buffer
  681. * @v len Length of data buffer
  682. * @ret rc Return status code
  683. */
  684. static int scsidev_read ( struct scsi_device *scsidev,
  685. struct interface *block,
  686. uint64_t lba, unsigned int count,
  687. userptr_t buffer, size_t len ) {
  688. return scsidev_command ( scsidev, block, &scsicmd_read,
  689. lba, count, buffer, len );
  690. }
  691. /**
  692. * Issue SCSI block write
  693. *
  694. * @v scsidev SCSI device
  695. * @v block Block data interface
  696. * @v lba Starting logical block address
  697. * @v count Number of blocks to transfer
  698. * @v buffer Data buffer
  699. * @v len Length of data buffer
  700. * @ret rc Return status code
  701. */
  702. static int scsidev_write ( struct scsi_device *scsidev,
  703. struct interface *block,
  704. uint64_t lba, unsigned int count,
  705. userptr_t buffer, size_t len ) {
  706. return scsidev_command ( scsidev, block, &scsicmd_write,
  707. lba, count, buffer, len );
  708. }
  709. /**
  710. * Read SCSI device capacity
  711. *
  712. * @v scsidev SCSI device
  713. * @v block Block data interface
  714. * @ret rc Return status code
  715. */
  716. static int scsidev_read_capacity ( struct scsi_device *scsidev,
  717. struct interface *block ) {
  718. return scsidev_command ( scsidev, block, &scsicmd_read_capacity,
  719. 0, 0, UNULL, 0 );
  720. }
  721. /**
  722. * Test to see if SCSI device is ready
  723. *
  724. * @v scsidev SCSI device
  725. * @v block Block data interface
  726. * @ret rc Return status code
  727. */
  728. static int scsidev_test_unit_ready ( struct scsi_device *scsidev,
  729. struct interface *block ) {
  730. return scsidev_command ( scsidev, block, &scsicmd_test_unit_ready,
  731. 0, 0, UNULL, 0 );
  732. }
  733. /**
  734. * Check SCSI device flow-control window
  735. *
  736. * @v scsidev SCSI device
  737. * @ret len Length of window
  738. */
  739. static size_t scsidev_window ( struct scsi_device *scsidev ) {
  740. /* Refuse commands until unit is confirmed ready */
  741. if ( ! ( scsidev->flags & SCSIDEV_UNIT_READY ) )
  742. return 0;
  743. return xfer_window ( &scsidev->scsi );
  744. }
  745. /**
  746. * Close SCSI device
  747. *
  748. * @v scsidev SCSI device
  749. * @v rc Reason for close
  750. */
  751. static void scsidev_close ( struct scsi_device *scsidev, int rc ) {
  752. struct scsi_command *scsicmd;
  753. struct scsi_command *tmp;
  754. /* Stop process */
  755. process_del ( &scsidev->process );
  756. /* Shut down interfaces */
  757. intfs_shutdown ( rc, &scsidev->block, &scsidev->scsi, &scsidev->ready,
  758. NULL );
  759. /* Shut down any remaining commands */
  760. list_for_each_entry_safe ( scsicmd, tmp, &scsidev->cmds, list )
  761. scsicmd_close ( scsicmd, rc );
  762. }
  763. /** SCSI device block interface operations */
  764. static struct interface_operation scsidev_block_op[] = {
  765. INTF_OP ( xfer_window, struct scsi_device *, scsidev_window ),
  766. INTF_OP ( block_read, struct scsi_device *, scsidev_read ),
  767. INTF_OP ( block_write, struct scsi_device *, scsidev_write ),
  768. INTF_OP ( block_read_capacity, struct scsi_device *,
  769. scsidev_read_capacity ),
  770. INTF_OP ( intf_close, struct scsi_device *, scsidev_close ),
  771. };
  772. /** SCSI device block interface descriptor */
  773. static struct interface_descriptor scsidev_block_desc =
  774. INTF_DESC_PASSTHRU ( struct scsi_device, block,
  775. scsidev_block_op, scsi );
  776. /**
  777. * Handle SCSI TEST UNIT READY response
  778. *
  779. * @v scsidev SCSI device
  780. * @v rc Reason for close
  781. */
  782. static void scsidev_ready ( struct scsi_device *scsidev, int rc ) {
  783. /* Shut down interface */
  784. intf_restart ( &scsidev->ready, rc );
  785. /* Mark device as ready, if applicable */
  786. if ( rc == 0 ) {
  787. DBGC ( scsidev, "SCSI %p unit is ready\n", scsidev );
  788. scsidev->flags |= SCSIDEV_UNIT_READY;
  789. xfer_window_changed ( &scsidev->block );
  790. return;
  791. }
  792. DBGC ( scsidev, "SCSI %p not ready: %s\n", scsidev, strerror ( rc ) );
  793. /* SCSI targets have an annoying habit of returning occasional
  794. * pointless "error" messages such as "power-on occurred", so
  795. * we have to be prepared to retry commands.
  796. *
  797. * For most commands, we rely on the caller (e.g. the generic
  798. * SAN device layer) to retry commands as needed. However, a
  799. * TEST UNIT READY failure is used as an indication that the
  800. * whole SCSI device is unavailable and should be closed. We
  801. * must therefore perform this retry loop within the SCSI
  802. * layer.
  803. */
  804. if ( scsidev->retries++ < SCSI_READY_MAX_RETRIES ) {
  805. DBGC ( scsidev, "SCSI %p retrying (retry %d)\n",
  806. scsidev, scsidev->retries );
  807. scsidev->flags &= ~SCSIDEV_UNIT_TESTED;
  808. process_add ( &scsidev->process );
  809. return;
  810. }
  811. /* Close device */
  812. DBGC ( scsidev, "SCSI %p never became ready: %s\n",
  813. scsidev, strerror ( rc ) );
  814. scsidev_close ( scsidev, rc );
  815. }
  816. /** SCSI device TEST UNIT READY interface operations */
  817. static struct interface_operation scsidev_ready_op[] = {
  818. INTF_OP ( intf_close, struct scsi_device *, scsidev_ready ),
  819. };
  820. /** SCSI device TEST UNIT READY interface descriptor */
  821. static struct interface_descriptor scsidev_ready_desc =
  822. INTF_DESC ( struct scsi_device, ready, scsidev_ready_op );
  823. /**
  824. * SCSI TEST UNIT READY process
  825. *
  826. * @v scsidev SCSI device
  827. */
  828. static void scsidev_step ( struct scsi_device *scsidev ) {
  829. int rc;
  830. /* Do nothing if we have already issued TEST UNIT READY */
  831. if ( scsidev->flags & SCSIDEV_UNIT_TESTED )
  832. return;
  833. /* Wait until underlying SCSI device is ready */
  834. if ( xfer_window ( &scsidev->scsi ) == 0 )
  835. return;
  836. DBGC ( scsidev, "SCSI %p waiting for unit to become ready\n",
  837. scsidev );
  838. /* Mark TEST UNIT READY as sent */
  839. scsidev->flags |= SCSIDEV_UNIT_TESTED;
  840. /* Issue TEST UNIT READY command */
  841. if ( ( rc = scsidev_test_unit_ready ( scsidev, &scsidev->ready )) !=0){
  842. scsidev_close ( scsidev, rc );
  843. return;
  844. }
  845. }
  846. /** SCSI device SCSI interface operations */
  847. static struct interface_operation scsidev_scsi_op[] = {
  848. INTF_OP ( xfer_window_changed, struct scsi_device *, scsidev_step ),
  849. INTF_OP ( intf_close, struct scsi_device *, scsidev_close ),
  850. };
  851. /** SCSI device SCSI interface descriptor */
  852. static struct interface_descriptor scsidev_scsi_desc =
  853. INTF_DESC_PASSTHRU ( struct scsi_device, scsi,
  854. scsidev_scsi_op, block );
  855. /** SCSI device process descriptor */
  856. static struct process_descriptor scsidev_process_desc =
  857. PROC_DESC_ONCE ( struct scsi_device, process, scsidev_step );
  858. /**
  859. * Open SCSI device
  860. *
  861. * @v block Block control interface
  862. * @v scsi SCSI control interface
  863. * @v lun SCSI LUN
  864. * @ret rc Return status code
  865. */
  866. int scsi_open ( struct interface *block, struct interface *scsi,
  867. struct scsi_lun *lun ) {
  868. struct scsi_device *scsidev;
  869. /* Allocate and initialise structure */
  870. scsidev = zalloc ( sizeof ( *scsidev ) );
  871. if ( ! scsidev )
  872. return -ENOMEM;
  873. ref_init ( &scsidev->refcnt, NULL );
  874. intf_init ( &scsidev->block, &scsidev_block_desc, &scsidev->refcnt );
  875. intf_init ( &scsidev->scsi, &scsidev_scsi_desc, &scsidev->refcnt );
  876. intf_init ( &scsidev->ready, &scsidev_ready_desc, &scsidev->refcnt );
  877. process_init ( &scsidev->process, &scsidev_process_desc,
  878. &scsidev->refcnt );
  879. INIT_LIST_HEAD ( &scsidev->cmds );
  880. memcpy ( &scsidev->lun, lun, sizeof ( scsidev->lun ) );
  881. DBGC ( scsidev, "SCSI %p created for LUN " SCSI_LUN_FORMAT "\n",
  882. scsidev, SCSI_LUN_DATA ( scsidev->lun ) );
  883. /* Attach to SCSI and parent interfaces, mortalise self, and return */
  884. intf_plug_plug ( &scsidev->scsi, scsi );
  885. intf_plug_plug ( &scsidev->block, block );
  886. ref_put ( &scsidev->refcnt );
  887. return 0;
  888. }