Deleted Added
full compact
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 ---