diff options
Diffstat (limited to 'drivers/scsi/scsi_scan.c')
-rw-r--r-- | drivers/scsi/scsi_scan.c | 68 |
1 files changed, 49 insertions, 19 deletions
diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c index 1a5474bd11a1..0f7e6f94d66b 100644 --- a/drivers/scsi/scsi_scan.c +++ b/drivers/scsi/scsi_scan.c | |||
@@ -33,11 +33,11 @@ | |||
33 | #include <asm/semaphore.h> | 33 | #include <asm/semaphore.h> |
34 | 34 | ||
35 | #include <scsi/scsi.h> | 35 | #include <scsi/scsi.h> |
36 | #include <scsi/scsi_cmnd.h> | ||
36 | #include <scsi/scsi_device.h> | 37 | #include <scsi/scsi_device.h> |
37 | #include <scsi/scsi_driver.h> | 38 | #include <scsi/scsi_driver.h> |
38 | #include <scsi/scsi_devinfo.h> | 39 | #include <scsi/scsi_devinfo.h> |
39 | #include <scsi/scsi_host.h> | 40 | #include <scsi/scsi_host.h> |
40 | #include <scsi/scsi_request.h> | ||
41 | #include <scsi/scsi_transport.h> | 41 | #include <scsi/scsi_transport.h> |
42 | #include <scsi/scsi_eh.h> | 42 | #include <scsi/scsi_eh.h> |
43 | 43 | ||
@@ -816,6 +816,32 @@ static inline void scsi_destroy_sdev(struct scsi_device *sdev) | |||
816 | put_device(&sdev->sdev_gendev); | 816 | put_device(&sdev->sdev_gendev); |
817 | } | 817 | } |
818 | 818 | ||
819 | #ifdef CONFIG_SCSI_LOGGING | ||
820 | /** | ||
821 | * scsi_inq_str - print INQUIRY data from min to max index, | ||
822 | * strip trailing whitespace | ||
823 | * @buf: Output buffer with at least end-first+1 bytes of space | ||
824 | * @inq: Inquiry buffer (input) | ||
825 | * @first: Offset of string into inq | ||
826 | * @end: Index after last character in inq | ||
827 | */ | ||
828 | static unsigned char *scsi_inq_str(unsigned char *buf, unsigned char *inq, | ||
829 | unsigned first, unsigned end) | ||
830 | { | ||
831 | unsigned term = 0, idx; | ||
832 | |||
833 | for (idx = 0; idx + first < end && idx + first < inq[4] + 5; idx++) { | ||
834 | if (inq[idx+first] > ' ') { | ||
835 | buf[idx] = inq[idx+first]; | ||
836 | term = idx+1; | ||
837 | } else { | ||
838 | buf[idx] = ' '; | ||
839 | } | ||
840 | } | ||
841 | buf[term] = 0; | ||
842 | return buf; | ||
843 | } | ||
844 | #endif | ||
819 | 845 | ||
820 | /** | 846 | /** |
821 | * scsi_probe_and_add_lun - probe a LUN, if a LUN is found add it | 847 | * scsi_probe_and_add_lun - probe a LUN, if a LUN is found add it |
@@ -880,10 +906,12 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, | |||
880 | if (scsi_probe_lun(sdev, result, result_len, &bflags)) | 906 | if (scsi_probe_lun(sdev, result, result_len, &bflags)) |
881 | goto out_free_result; | 907 | goto out_free_result; |
882 | 908 | ||
909 | if (bflagsp) | ||
910 | *bflagsp = bflags; | ||
883 | /* | 911 | /* |
884 | * result contains valid SCSI INQUIRY data. | 912 | * result contains valid SCSI INQUIRY data. |
885 | */ | 913 | */ |
886 | if ((result[0] >> 5) == 3) { | 914 | if (((result[0] >> 5) == 3) && !(bflags & BLIST_ATTACH_PQ3)) { |
887 | /* | 915 | /* |
888 | * For a Peripheral qualifier 3 (011b), the SCSI | 916 | * For a Peripheral qualifier 3 (011b), the SCSI |
889 | * spec says: The device server is not capable of | 917 | * spec says: The device server is not capable of |
@@ -894,9 +922,22 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, | |||
894 | * logical disk configured at sdev->lun, but there | 922 | * logical disk configured at sdev->lun, but there |
895 | * is a target id responding. | 923 | * is a target id responding. |
896 | */ | 924 | */ |
897 | SCSI_LOG_SCAN_BUS(3, printk(KERN_INFO | 925 | SCSI_LOG_SCAN_BUS(2, sdev_printk(KERN_INFO, sdev, "scsi scan:" |
898 | "scsi scan: peripheral qualifier of 3," | 926 | " peripheral qualifier of 3, device not" |
899 | " no device added\n")); | 927 | " added\n")) |
928 | if (lun == 0) { | ||
929 | SCSI_LOG_SCAN_BUS(1, { | ||
930 | unsigned char vend[9]; | ||
931 | unsigned char mod[17]; | ||
932 | |||
933 | sdev_printk(KERN_INFO, sdev, | ||
934 | "scsi scan: consider passing scsi_mod." | ||
935 | "dev_flags=%s:%s:0x240 or 0x800240\n", | ||
936 | scsi_inq_str(vend, result, 8, 16), | ||
937 | scsi_inq_str(mod, result, 16, 32)); | ||
938 | }); | ||
939 | } | ||
940 | |||
900 | res = SCSI_SCAN_TARGET_PRESENT; | 941 | res = SCSI_SCAN_TARGET_PRESENT; |
901 | goto out_free_result; | 942 | goto out_free_result; |
902 | } | 943 | } |
@@ -920,8 +961,6 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, | |||
920 | sdev->lockable = 0; | 961 | sdev->lockable = 0; |
921 | scsi_unlock_floptical(sdev, result); | 962 | scsi_unlock_floptical(sdev, result); |
922 | } | 963 | } |
923 | if (bflagsp) | ||
924 | *bflagsp = bflags; | ||
925 | } | 964 | } |
926 | 965 | ||
927 | out_free_result: | 966 | out_free_result: |
@@ -946,7 +985,6 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, | |||
946 | * scsi_sequential_lun_scan - sequentially scan a SCSI target | 985 | * scsi_sequential_lun_scan - sequentially scan a SCSI target |
947 | * @starget: pointer to target structure to scan | 986 | * @starget: pointer to target structure to scan |
948 | * @bflags: black/white list flag for LUN 0 | 987 | * @bflags: black/white list flag for LUN 0 |
949 | * @lun0_res: result of scanning LUN 0 | ||
950 | * | 988 | * |
951 | * Description: | 989 | * Description: |
952 | * Generally, scan from LUN 1 (LUN 0 is assumed to already have been | 990 | * Generally, scan from LUN 1 (LUN 0 is assumed to already have been |
@@ -956,8 +994,7 @@ static int scsi_probe_and_add_lun(struct scsi_target *starget, | |||
956 | * Modifies sdevscan->lun. | 994 | * Modifies sdevscan->lun. |
957 | **/ | 995 | **/ |
958 | static void scsi_sequential_lun_scan(struct scsi_target *starget, | 996 | static void scsi_sequential_lun_scan(struct scsi_target *starget, |
959 | int bflags, int lun0_res, int scsi_level, | 997 | int bflags, int scsi_level, int rescan) |
960 | int rescan) | ||
961 | { | 998 | { |
962 | unsigned int sparse_lun, lun, max_dev_lun; | 999 | unsigned int sparse_lun, lun, max_dev_lun; |
963 | struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); | 1000 | struct Scsi_Host *shost = dev_to_shost(starget->dev.parent); |
@@ -978,13 +1015,6 @@ static void scsi_sequential_lun_scan(struct scsi_target *starget, | |||
978 | sparse_lun = 0; | 1015 | sparse_lun = 0; |
979 | 1016 | ||
980 | /* | 1017 | /* |
981 | * If not sparse lun and no device attached at LUN 0 do not scan | ||
982 | * any further. | ||
983 | */ | ||
984 | if (!sparse_lun && (lun0_res != SCSI_SCAN_LUN_PRESENT)) | ||
985 | return; | ||
986 | |||
987 | /* | ||
988 | * If less than SCSI_1_CSS, and no special lun scaning, stop | 1018 | * If less than SCSI_1_CSS, and no special lun scaning, stop |
989 | * scanning; this matches 2.4 behaviour, but could just be a bug | 1019 | * scanning; this matches 2.4 behaviour, but could just be a bug |
990 | * (to continue scanning a SCSI_1_CSS device). | 1020 | * (to continue scanning a SCSI_1_CSS device). |
@@ -1395,7 +1425,7 @@ static void __scsi_scan_target(struct device *parent, unsigned int channel, | |||
1395 | * do a sequential scan. | 1425 | * do a sequential scan. |
1396 | */ | 1426 | */ |
1397 | scsi_sequential_lun_scan(starget, bflags, | 1427 | scsi_sequential_lun_scan(starget, bflags, |
1398 | res, starget->scsi_level, rescan); | 1428 | starget->scsi_level, rescan); |
1399 | } | 1429 | } |
1400 | 1430 | ||
1401 | out_reap: | 1431 | out_reap: |
@@ -1473,7 +1503,7 @@ int scsi_scan_host_selected(struct Scsi_Host *shost, unsigned int channel, | |||
1473 | __FUNCTION__, channel, id, lun)); | 1503 | __FUNCTION__, channel, id, lun)); |
1474 | 1504 | ||
1475 | if (((channel != SCAN_WILD_CARD) && (channel > shost->max_channel)) || | 1505 | if (((channel != SCAN_WILD_CARD) && (channel > shost->max_channel)) || |
1476 | ((id != SCAN_WILD_CARD) && (id > shost->max_id)) || | 1506 | ((id != SCAN_WILD_CARD) && (id >= shost->max_id)) || |
1477 | ((lun != SCAN_WILD_CARD) && (lun > shost->max_lun))) | 1507 | ((lun != SCAN_WILD_CARD) && (lun > shost->max_lun))) |
1478 | return -EINVAL; | 1508 | return -EINVAL; |
1479 | 1509 | ||