sbp_targ.c (170872) | sbp_targ.c (225950) |
---|---|
1/*- 2 * Copyright (C) 2003 3 * Hidetoshi Shimokawa. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 17 unchanged lines hidden (view full) --- 26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 * | 1/*- 2 * Copyright (C) 2003 3 * Hidetoshi Shimokawa. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 17 unchanged lines hidden (view full) --- 26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 * |
34 * $FreeBSD: head/sys/dev/firewire/sbp_targ.c 170872 2007-06-17 05:55:54Z scottl $ | 34 * $FreeBSD: head/sys/dev/firewire/sbp_targ.c 225950 2011-10-03 20:32:55Z ken $ |
35 */ 36 37#include <sys/param.h> 38#include <sys/kernel.h> 39#include <sys/systm.h> 40#include <sys/sysctl.h> 41#include <sys/types.h> 42#include <sys/conf.h> 43#include <sys/malloc.h> | 35 */ 36 37#include <sys/param.h> 38#include <sys/kernel.h> 39#include <sys/systm.h> 40#include <sys/sysctl.h> 41#include <sys/types.h> 42#include <sys/conf.h> 43#include <sys/malloc.h> |
44#include <sys/endian.h> |
|
44#if __FreeBSD_version < 500000 45#include <sys/devicestat.h> 46#endif 47 48#include <sys/bus.h> 49#include <machine/bus.h> 50 51#include <dev/firewire/firewire.h> --- 575 unchanged lines hidden (view full) --- 627 sbp_status->len = 1; 628 break; 629 case SCSI_STATUS_CHECK_COND: 630 case SCSI_STATUS_BUSY: 631 case SCSI_STATUS_CMD_TERMINATED: 632 { 633 struct sbp_cmd_status *sbp_cmd_status; 634 struct scsi_sense_data *sense; | 45#if __FreeBSD_version < 500000 46#include <sys/devicestat.h> 47#endif 48 49#include <sys/bus.h> 50#include <machine/bus.h> 51 52#include <dev/firewire/firewire.h> --- 575 unchanged lines hidden (view full) --- 628 sbp_status->len = 1; 629 break; 630 case SCSI_STATUS_CHECK_COND: 631 case SCSI_STATUS_BUSY: 632 case SCSI_STATUS_CMD_TERMINATED: 633 { 634 struct sbp_cmd_status *sbp_cmd_status; 635 struct scsi_sense_data *sense; |
636 int error_code, sense_key, asc, ascq; 637 uint8_t stream_bits; 638 uint8_t sks[3]; 639 uint64_t info; 640 int64_t sinfo; 641 int sense_len; |
|
635 636 if (debug) 637 printf("%s: STATUS %d\n", __func__, 638 ccb->csio.scsi_status); 639 sbp_cmd_status = (struct sbp_cmd_status *)&sbp_status->data[0]; 640 sbp_cmd_status->status = ccb->csio.scsi_status; 641 sense = &ccb->csio.sense_data; 642 --- 11 unchanged lines hidden (view full) --- 654 } 655 sbp_targ_remove_orb_info_locked(orbi->login, norbi); 656 norbi = STAILQ_NEXT(norbi, link); 657 free(norbi, M_SBP_TARG); 658 } 659#endif 660#endif 661 | 642 643 if (debug) 644 printf("%s: STATUS %d\n", __func__, 645 ccb->csio.scsi_status); 646 sbp_cmd_status = (struct sbp_cmd_status *)&sbp_status->data[0]; 647 sbp_cmd_status->status = ccb->csio.scsi_status; 648 sense = &ccb->csio.sense_data; 649 --- 11 unchanged lines hidden (view full) --- 661 } 662 sbp_targ_remove_orb_info_locked(orbi->login, norbi); 663 norbi = STAILQ_NEXT(norbi, link); 664 free(norbi, M_SBP_TARG); 665 } 666#endif 667#endif 668 |
662 if ((sense->error_code & SSD_ERRCODE) == SSD_CURRENT_ERROR) | 669 sense_len = ccb->csio.sense_len - ccb->csio.sense_resid; 670 scsi_extract_sense_len(sense, sense_len, &error_code, 671 &sense_key, &asc, &ascq, /*show_errors*/ 0); 672 673 switch (error_code) { 674 case SSD_CURRENT_ERROR: 675 case SSD_DESC_CURRENT_ERROR: |
663 sbp_cmd_status->sfmt = SBP_SFMT_CURR; | 676 sbp_cmd_status->sfmt = SBP_SFMT_CURR; |
664 else | 677 break; 678 default: |
665 sbp_cmd_status->sfmt = SBP_SFMT_DEFER; | 679 sbp_cmd_status->sfmt = SBP_SFMT_DEFER; |
680 break; 681 } |
|
666 | 682 |
667 sbp_cmd_status->valid = (sense->error_code & SSD_ERRCODE_VALID) 668 ? 1 : 0; 669 sbp_cmd_status->s_key = sense->flags & SSD_KEY; 670 sbp_cmd_status->mark = (sense->flags & SSD_FILEMARK)? 1 : 0; 671 sbp_cmd_status->eom = (sense->flags & SSD_EOM) ? 1 : 0; 672 sbp_cmd_status->ill_len = (sense->flags & SSD_ILI) ? 1 : 0; | 683 if (scsi_get_sense_info(sense, sense_len, SSD_DESC_INFO, &info, 684 &sinfo) == 0) { 685 uint32_t info_trunc; 686 sbp_cmd_status->valid = 1; 687 info_trunc = info; |
673 | 688 |
674 bcopy(&sense->info[0], &sbp_cmd_status->info, 4); | 689 sbp_cmd_status->info = htobe32(info_trunc); 690 } else { 691 sbp_cmd_status->valid = 0; 692 } |
675 | 693 |
676 if (sense->extra_len <= 6) 677 /* add_sense_code(_qual), info, cmd_spec_info */ 678 sbp_status->len = 4; 679 else 680 /* fru, sense_key_spec */ 681 sbp_status->len = 5; 682 683 bcopy(&sense->cmd_spec_info[0], &sbp_cmd_status->cdb, 4); | 694 sbp_cmd_status->s_key = sense_key; |
684 | 695 |
685 sbp_cmd_status->s_code = sense->add_sense_code; 686 sbp_cmd_status->s_qlfr = sense->add_sense_code_qual; 687 sbp_cmd_status->fru = sense->fru; | 696 if (scsi_get_stream_info(sense, sense_len, NULL, 697 &stream_bits) == 0) { 698 sbp_cmd_status->mark = 699 (stream_bits & SSD_FILEMARK) ? 1 : 0; 700 sbp_cmd_status->eom = 701 (stream_bits & SSD_EOM) ? 1 : 0; 702 sbp_cmd_status->ill_len = 703 (stream_bits & SSD_ILI) ? 1 : 0; 704 } else { 705 sbp_cmd_status->mark = 0; 706 sbp_cmd_status->eom = 0; 707 sbp_cmd_status->ill_len = 0; 708 } |
688 | 709 |
689 bcopy(&sense->sense_key_spec[0], 690 &sbp_cmd_status->s_keydep[0], 3); | |
691 | 710 |
711 /* add_sense_code(_qual), info, cmd_spec_info */ 712 sbp_status->len = 4; 713 714 if (scsi_get_sense_info(sense, sense_len, SSD_DESC_COMMAND, 715 &info, &sinfo) == 0) { 716 uint32_t cmdspec_trunc; 717 718 cmdspec_trunc = info; 719 720 sbp_cmd_status->cdb = htobe32(cmdspec_trunc); 721 } 722 723 sbp_cmd_status->s_code = asc; 724 sbp_cmd_status->s_qlfr = ascq; 725 726 if (scsi_get_sense_info(sense, sense_len, SSD_DESC_FRU, &info, 727 &sinfo) == 0) { 728 sbp_cmd_status->fru = (uint8_t)info; 729 sbp_status->len = 5; 730 } else { 731 sbp_cmd_status->fru = 0; 732 } 733 734 if (scsi_get_sks(sense, sense_len, sks) == 0) { 735 bcopy(sks, &sbp_cmd_status->s_keydep[0], sizeof(sks)); 736 sbp_status->len = 5; 737 } 738 |
|
692 break; 693 } 694 default: 695 printf("%s: unknown scsi status 0x%x\n", __func__, 696 sbp_status->status); 697 } 698 699 if (orbi->page_table != NULL) --- 1090 unchanged lines hidden --- | 739 break; 740 } 741 default: 742 printf("%s: unknown scsi status 0x%x\n", __func__, 743 sbp_status->status); 744 } 745 746 if (orbi->page_table != NULL) --- 1090 unchanged lines hidden --- |