umass.c (225350) | umass.c (225950) |
---|---|
1#include <sys/cdefs.h> | 1#include <sys/cdefs.h> |
2__FBSDID("$FreeBSD: head/sys/dev/usb/storage/umass.c 225350 2011-09-02 18:50:44Z hselasky $"); | 2__FBSDID("$FreeBSD: head/sys/dev/usb/storage/umass.c 225950 2011-10-03 20:32:55Z ken $"); |
3 4/*- 5 * Copyright (c) 1999 MAEKAWA Masahide <bishop@rr.iij4u.or.jp>, 6 * Nick Hibma <n_hibma@FreeBSD.org> 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions --- 11 unchanged lines hidden (view full) --- 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 * | 3 4/*- 5 * Copyright (c) 1999 MAEKAWA Masahide <bishop@rr.iij4u.or.jp>, 6 * Nick Hibma <n_hibma@FreeBSD.org> 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions --- 11 unchanged lines hidden (view full) --- 22 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 23 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 24 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 25 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 26 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 27 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 28 * SUCH DAMAGE. 29 * |
30 * $FreeBSD: head/sys/dev/usb/storage/umass.c 225350 2011-09-02 18:50:44Z hselasky $ | 30 * $FreeBSD: head/sys/dev/usb/storage/umass.c 225950 2011-10-03 20:32:55Z ken $ |
31 * $NetBSD: umass.c,v 1.28 2000/04/02 23:46:53 augustss Exp $ 32 */ 33 34/* Also already merged from NetBSD: 35 * $NetBSD: umass.c,v 1.67 2001/11/25 19:05:22 augustss Exp $ 36 * $NetBSD: umass.c,v 1.90 2002/11/04 19:17:33 pooka Exp $ 37 * $NetBSD: umass.c,v 1.108 2003/11/07 17:03:25 wiz Exp $ 38 * $NetBSD: umass.c,v 1.109 2003/12/04 13:57:31 keihan Exp $ --- 2300 unchanged lines hidden (view full) --- 2339 } 2340 2341 /* 2342 * Handle EVPD inquiry for broken devices first 2343 * NO_INQUIRY also implies NO_INQUIRY_EVPD 2344 */ 2345 if ((sc->sc_quirks & (NO_INQUIRY_EVPD | NO_INQUIRY)) && 2346 (sc->sc_transfer.cmd_data[1] & SI_EVPD)) { | 31 * $NetBSD: umass.c,v 1.28 2000/04/02 23:46:53 augustss Exp $ 32 */ 33 34/* Also already merged from NetBSD: 35 * $NetBSD: umass.c,v 1.67 2001/11/25 19:05:22 augustss Exp $ 36 * $NetBSD: umass.c,v 1.90 2002/11/04 19:17:33 pooka Exp $ 37 * $NetBSD: umass.c,v 1.108 2003/11/07 17:03:25 wiz Exp $ 38 * $NetBSD: umass.c,v 1.109 2003/12/04 13:57:31 keihan Exp $ --- 2300 unchanged lines hidden (view full) --- 2339 } 2340 2341 /* 2342 * Handle EVPD inquiry for broken devices first 2343 * NO_INQUIRY also implies NO_INQUIRY_EVPD 2344 */ 2345 if ((sc->sc_quirks & (NO_INQUIRY_EVPD | NO_INQUIRY)) && 2346 (sc->sc_transfer.cmd_data[1] & SI_EVPD)) { |
2347 struct scsi_sense_data *sense; | |
2348 | 2347 |
2349 sense = &ccb->csio.sense_data; 2350 bzero(sense, sizeof(*sense)); 2351 sense->error_code = SSD_CURRENT_ERROR; 2352 sense->flags = SSD_KEY_ILLEGAL_REQUEST; 2353 sense->add_sense_code = 0x24; 2354 sense->extra_len = 10; | 2348 scsi_set_sense_data(&ccb->csio.sense_data, 2349 /*sense_format*/ SSD_TYPE_NONE, 2350 /*current_error*/ 1, 2351 /*sense_key*/ SSD_KEY_ILLEGAL_REQUEST, 2352 /*asc*/ 0x24, 2353 /*ascq*/ 0x00, 2354 /*extra args*/ SSD_ELEM_NONE); |
2355 ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND; 2356 ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR | 2357 CAM_AUTOSNS_VALID; 2358 xpt_done(ccb); 2359 goto done; 2360 } 2361 /* 2362 * Return fake inquiry data for --- 263 unchanged lines hidden (view full) --- 2626/* 2627 * Finalise a completed autosense operation 2628 */ 2629static void 2630umass_cam_sense_cb(struct umass_softc *sc, union ccb *ccb, uint32_t residue, 2631 uint8_t status) 2632{ 2633 uint8_t *cmd; | 2355 ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND; 2356 ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR | 2357 CAM_AUTOSNS_VALID; 2358 xpt_done(ccb); 2359 goto done; 2360 } 2361 /* 2362 * Return fake inquiry data for --- 263 unchanged lines hidden (view full) --- 2626/* 2627 * Finalise a completed autosense operation 2628 */ 2629static void 2630umass_cam_sense_cb(struct umass_softc *sc, union ccb *ccb, uint32_t residue, 2631 uint8_t status) 2632{ 2633 uint8_t *cmd; |
2634 uint8_t key; | |
2635 2636 switch (status) { 2637 case STATUS_CMD_OK: 2638 case STATUS_CMD_UNKNOWN: | 2634 2635 switch (status) { 2636 case STATUS_CMD_OK: 2637 case STATUS_CMD_UNKNOWN: |
2639 case STATUS_CMD_FAILED: | 2638 case STATUS_CMD_FAILED: { 2639 int key, sense_len; |
2640 | 2640 |
2641 ccb->csio.sense_resid = residue; 2642 sense_len = ccb->csio.sense_len - ccb->csio.sense_resid; 2643 key = scsi_get_sense_key(&ccb->csio.sense_data, sense_len, 2644 /*show_errors*/ 1); 2645 |
|
2641 if (ccb->csio.ccb_h.flags & CAM_CDB_POINTER) { 2642 cmd = (uint8_t *)(ccb->csio.cdb_io.cdb_ptr); 2643 } else { 2644 cmd = (uint8_t *)(ccb->csio.cdb_io.cdb_bytes); 2645 } 2646 | 2646 if (ccb->csio.ccb_h.flags & CAM_CDB_POINTER) { 2647 cmd = (uint8_t *)(ccb->csio.cdb_io.cdb_ptr); 2648 } else { 2649 cmd = (uint8_t *)(ccb->csio.cdb_io.cdb_bytes); 2650 } 2651 |
2647 key = (ccb->csio.sense_data.flags & SSD_KEY); 2648 | |
2649 /* 2650 * Getting sense data always succeeds (apart from wire 2651 * failures): 2652 */ 2653 if ((sc->sc_quirks & RS_NO_CLEAR_UA) && 2654 (cmd[0] == INQUIRY) && 2655 (key == SSD_KEY_UNIT_ATTENTION)) { 2656 /* --- 42 unchanged lines hidden (view full) --- 2699 break; 2700 } else { 2701 ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR 2702 | CAM_AUTOSNS_VALID; 2703 ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND; 2704 } 2705 xpt_done(ccb); 2706 break; | 2652 /* 2653 * Getting sense data always succeeds (apart from wire 2654 * failures): 2655 */ 2656 if ((sc->sc_quirks & RS_NO_CLEAR_UA) && 2657 (cmd[0] == INQUIRY) && 2658 (key == SSD_KEY_UNIT_ATTENTION)) { 2659 /* --- 42 unchanged lines hidden (view full) --- 2702 break; 2703 } else { 2704 ccb->ccb_h.status = CAM_SCSI_STATUS_ERROR 2705 | CAM_AUTOSNS_VALID; 2706 ccb->csio.scsi_status = SCSI_STATUS_CHECK_COND; 2707 } 2708 xpt_done(ccb); 2709 break; |
2707 | 2710 } |
2708 default: 2709 DPRINTF(sc, UDMASS_SCSI, "Autosense failed, " 2710 "status %d\n", status); 2711 ccb->ccb_h.status = CAM_AUTOSENSE_FAIL; 2712 xpt_done(ccb); 2713 } 2714} 2715 --- 395 unchanged lines hidden --- | 2711 default: 2712 DPRINTF(sc, UDMASS_SCSI, "Autosense failed, " 2713 "status %d\n", status); 2714 ccb->ccb_h.status = CAM_AUTOSENSE_FAIL; 2715 xpt_done(ccb); 2716 } 2717} 2718 --- 395 unchanged lines hidden --- |