sym2 version 2.2.2
cover sym2 version 2.2.2
I've split the patches out of the git tree, as requested by James. They
should follow as replies to this mail. I wish git had a better script
to do this.
These patches really should make it into 2.6.15; they fix about 4 bugzillas.
PATCH 1/11 Remove FreeBSD ifdefs
Remove FreeBSD ifdefs from sym2 driver
---
drivers/scsi/sym53c8xx_2/sym_fw.c | 12 ------------ drivers/scsi/sym53c8xx_2/sym_malloc.c | 4 ---- 2 files changed, 0 insertions(+), 16 deletions(-)
applies-to: 980297c1747ca89354bc879cc5d17903eacb19e2 2af497794dd514ee3ea22fd6de7f62efbdd296b4
drivers/scsi/sym53c8xx_2/sym_fw.c +0 -12
@@ -37,11 +37,7 @@* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifdef __FreeBSD__ -#include <dev/sym/sym_glue.h> -#else #include "sym_glue.h" -#endif /* * Macros used for all firmwares.
@@ -60,11 +56,7 @@#define SYM_FWA_SCR sym_fw1a_scr#define SYM_FWB_SCR sym_fw1b_scr#define SYM_FWZ_SCR sym_fw1z_scr -#ifdef __FreeBSD__ -#include <dev/sym/sym_fw1.h> -#else #include "sym_fw1.h" -#endif static struct sym_fwa_ofs sym_fw1a_ofs = { SYM_GEN_FW_A(struct SYM_FWA_SCR) };
@@ -88,11 +80,7 @@ static struct sym_fwz_ofs sym_fw1z_ofs =#define SYM_FWA_SCR sym_fw2a_scr#define SYM_FWB_SCR sym_fw2b_scr#define SYM_FWZ_SCR sym_fw2z_scr -#ifdef __FreeBSD__ -#include <dev/sym/sym_fw2.h> -#else #include "sym_fw2.h" -#endif static struct sym_fwa_ofs sym_fw2a_ofs = { SYM_GEN_FW_A(struct SYM_FWA_SCR) };
drivers/scsi/sym53c8xx_2/sym_malloc.c +0 -4
@@ -37,11 +37,7 @@* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ -#ifdef __FreeBSD__ -#include <dev/sym/sym_glue.h> -#else #include "sym_glue.h" -#endif /* * Simple power of two buddy-like generic allocator.
---
0.99.9.GIT
PATCH 2/11 Remove last vestiges of sym_sniff_inquiry
In reply to Matthew WilcoxThe SYM_OPT_SNIFF_INQUIRY define is never set any more, and the sym_sniff_inquiry() function doesn't exist
From: Christoph Hellwig <[email protected]>
---
drivers/scsi/sym53c8xx_2/sym_glue.h | 1 - drivers/scsi/sym53c8xx_2/sym_hipd.c | 9 --------- 2 files changed, 0 insertions(+), 10 deletions(-)
applies-to: 7657ff9db89cd74775d5b3caf4042076c31480fd 202ebf1182030b892cfd8ae48389eb4504c0b606
drivers/scsi/sym53c8xx_2/sym_glue.h +0 -1
@@ -268,6 +268,5 @@ void sym_xpt_async_bus_reset(struct sym_void sym_xpt_async_sent_bdr (struct sym_hcb *np,int target);int sym_setup_data_and_start (struct sym_hcb *np,struct scsi_cmnd *csio,struct sym_ccb *cp);void sym_log_bus_error (struct sym_hcb *np); -void sym_sniff_inquiry (struct sym_hcb *np,struct scsi_cmnd *cmd,int resid);#endif /* SYM_GLUE_H */
drivers/scsi/sym53c8xx_2/sym_hipd.c +0 -9
@@ -5551,15 +5551,6 @@ if (resid)*/ sym_set_cam_result_ok (cp, cmd, resid); -#ifdef SYM_OPT_SNIFF_INQUIRY -/* -* On standard INQUIRY response (EVPD and CmDt -* not set), sniff out device capabilities. -*/ -if (cp->cdb_buf[0 ] ==INQUIRY && !(cp->cdb_buf[1 ] &0x3 )) -sym_sniff_inquiry (np, cmd, resid); -#endif -#ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING /* * If max number of started ccbs had been reduced,
---
0.99.9.GIT
PATCH 3/11 Manage sym_lcb properly
In reply to Matthew WilcoxAllocate the lcb in slave_alloc and free it in slave_destroy. This allows us to remove all the code that checks to see if it's already been allocated.
From: Christoph Hellwig <[email protected]>
---
drivers/scsi/sym53c8xx_2/sym_glue.c | 59 +++++++++++++----------- drivers/scsi/sym53c8xx_2/sym_hipd.c | 86 +++-------------------------------- drivers/scsi/sym53c8xx_2/sym_hipd.h | 14 ------ 3 files changed, 38 insertions(+), 121 deletions(-)
applies-to: 39aa6a194e7e6c1d9161ef6a8163cbd8d5874abc d1fa3658c5837cd3284f0cee1d03025b6eff4f50
drivers/scsi/sym53c8xx_2/sym_glue.c +31 -28
@@ -563,10 +563,7 @@ int sym_setup_data_and_start(struct sym_/* * activate this job. */ -if (lp) -sym_start_next_ccbs (np, lp,2 ); -else -sym_put_start_queue (np, cp); +sym_start_next_ccbs (np, lp,2 );return 0 ; out_abort:
@@ -981,15 +978,13 @@ static int device_queue_depth(struct symstatic int sym53c8xx_slave_alloc (struct scsi_device *sdev) { -struct sym_hcb *np; -struct sym_tcb *tp; +struct sym_hcb *np =sym_get_hcb (sdev->host); +struct sym_tcb *tp = &np->target[sdev->id]; +struct sym_lcb *lp;if (sdev->id >=SYM_CONF_MAX_TARGET || sdev->lun >=SYM_CONF_MAX_LUN )return -ENXIO ; - np =sym_get_hcb (sdev->host); - tp = &np->target[sdev->id]; -/* * Fail the device init if the device is flagged NOSCAN at BOOT in * the NVRAM. This may speed up boot and maintain coherency with
@@ -1005,6 +1000,10 @@ static int sym53c8xx_slave_alloc(structreturn -ENXIO ; } + lp =sym_alloc_lcb (np, sdev->id, sdev->lun); +if (!lp) +return -ENOMEM ; + tp->starget = sdev->sdev_target;return 0 ; }
@@ -1012,22 +1011,14 @@ static int sym53c8xx_slave_alloc(struct/* * Linux entry point for device queue sizing. */ -static int sym53c8xx_slave_configure (struct scsi_device *device) +static int sym53c8xx_slave_configure (struct scsi_device *sdev) { -struct sym_hcb *np =sym_get_hcb (device->host); -struct sym_tcb *tp = &np->target[device->id]; -struct sym_lcb *lp; +struct sym_hcb *np =sym_get_hcb (sdev->host); +struct sym_tcb *tp = &np->target[sdev->id]; +struct sym_lcb *lp =sym_lp (tp, sdev->lun);int reqtags, depth_to_use;/* -* Allocate the LCB if not yet. -* If it fail, we may well be in the sh*t. :) -*/ - lp =sym_alloc_lcb (np, device->id, device->lun); -if (!lp) -return -ENOMEM ; - -/* * Get user flags. */ lp->curr_flags = lp->user_flags;
@@ -1038,10 +1029,10 @@ static int sym53c8xx_slave_configure(str* Use at least 2. * Donnot use more than our maximum. */ - reqtags =device_queue_depth (np, device->id, device->lun); + reqtags =device_queue_depth (np, sdev->id, sdev->lun);if (reqtags > tp->usrtags) reqtags = tp->usrtags; -if (!device->tagged_supported) +if (!sdev->tagged_supported) reqtags =0 ;#if 1 /* Avoid to locally queue commands for no good reasons */ if (reqtags >SYM_CONF_MAX_TAG )
@@ -1050,19 +1041,30 @@ static int sym53c8xx_slave_configure(str#else depth_to_use = (reqtags ?SYM_CONF_MAX_TAG :2 );#endif -scsi_adjust_queue_depth (device, - (device->tagged_supported ? +scsi_adjust_queue_depth (sdev, + (sdev->tagged_supported ?MSG_SIMPLE_TAG :0 ), depth_to_use); lp->s.scdev_depth = depth_to_use; -sym_tune_dev_queuing (tp, device->lun, reqtags); +sym_tune_dev_queuing (tp, sdev->lun, reqtags); -if (!spi_initial_dv (device->sdev_target)) -spi_dv_device (device); +if (!spi_initial_dv (sdev->sdev_target)) +spi_dv_device (sdev);return 0 ; } +static void sym53c8xx_slave_destroy (struct scsi_device *sdev) +{ +struct sym_hcb *np =sym_get_hcb (sdev->host); +struct sym_lcb *lp =sym_lp (&np->target[sdev->id], sdev->lun); + +if (lp->itlq_tbl) +sym_mfree_dma (lp->itlq_tbl,SYM_CONF_MAX_TASK *4 ,"ITLQ_TBL" ); +kfree (lp->cb_tags); +sym_mfree_dma (lp,sizeof (*lp),"LCB" ); +} +/* * Linux entry point for info() function */
@@ -1926,6 +1928,7 @@ static struct scsi_host_template sym2_te .queuecommand = sym53c8xx_queue_command, .slave_alloc = sym53c8xx_slave_alloc, .slave_configure = sym53c8xx_slave_configure, + .slave_destroy = sym53c8xx_slave_destroy, .eh_abort_handler = sym53c8xx_eh_abort_handler, .eh_device_reset_handler = sym53c8xx_eh_device_reset_handler, .eh_bus_reset_handler = sym53c8xx_eh_bus_reset_handler,
drivers/scsi/sym53c8xx_2/sym_hipd.c +7 -79
152 lines not on this page · raw message
drivers/scsi/sym53c8xx_2/sym_hipd.h +0 -14
@@ -416,19 +416,6 @@ struct sym_tcb {struct sym_lcb **lunmp;/* Other LCBs [1..MAX_LUN] */ #endif -/* -* Bitmap that tells about LUNs that succeeded at least -* 1 IO and therefore assumed to be a real device. -* Avoid useless allocation of the LCB structure. -*/ -u32 lun_map[(SYM_CONF_MAX_LUN +31 )/32 ]; - -/* -* Bitmap that tells about LUNs that haven't yet an LCB -* allocated (not discovered or LCB allocation failed). -*/ -u32 busy0_map[(SYM_CONF_MAX_LUN +31 )/32 ]; -#ifdef SYM_HAVE_STCB /* * O/S specific data structure.
@@ -1077,7 +1064,6 @@ char *sym_driver_name(void);void sym_print_xerr (struct scsi_cmnd *cmd,int x_status);int sym_reset_scsi_bus (struct sym_hcb *np,int enab_int);struct sym_chip *sym_lookup_chip_table (u_short device_id,u_char revision); -void sym_put_start_queue (struct sym_hcb *np,struct sym_ccb *cp);#ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING void sym_start_next_ccbs (struct sym_hcb *np,struct sym_lcb *lp,int maxn);#endif
---
0.99.9.GIT
PATCH 4/11 Remove code to handle DMA_BIDIRECTION requests
In reply to Matthew WilcoxThe upper layer doesn't send these down since 2.4.x (or 2.6 in practice), so no need to handle it. Inline sym_setup_data_pointers into its only caller so we can fail gracefully in the case we'd get one neverless.
---
drivers/scsi/sym53c8xx_2/sym_fw.c | 6 --- drivers/scsi/sym53c8xx_2/sym_fw.h | 6 --- drivers/scsi/sym53c8xx_2/sym_fw1.h | 48 -------------------- drivers/scsi/sym53c8xx_2/sym_fw2.h | 52 ---------------------- drivers/scsi/sym53c8xx_2/sym_glue.c | 39 +++++++++++++++- drivers/scsi/sym53c8xx_2/sym_glue.h | 1 drivers/scsi/sym53c8xx_2/sym_hipd.c | 8 ++- drivers/scsi/sym53c8xx_2/sym_hipd.h | 84 ----------------------------------- 8 files changed, 40 insertions(+), 204 deletions(-)
applies-to: e1b800876a9da29e28cbdce5d11db7884d50542c 15a1cca64aced042ec913e4cf00c7cbad661820b
drivers/scsi/sym53c8xx_2/sym_fw.c +0 -6
@@ -62,9 +62,6 @@ static struct sym_fwa_ofs sym_fw1a_ofs = };static struct sym_fwb_ofs sym_fw1b_ofs = { SYM_GEN_FW_B(struct SYM_FWB_SCR) -#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN - SYM_GEN_B(struct SYM_FWB_SCR, data_io) -#endif };static struct sym_fwz_ofs sym_fw1z_ofs = { SYM_GEN_FW_Z(struct SYM_FWZ_SCR)
@@ -86,9 +83,6 @@ static struct sym_fwa_ofs sym_fw2a_ofs = };static struct sym_fwb_ofs sym_fw2b_ofs = { SYM_GEN_FW_B(struct SYM_FWB_SCR) -#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN - SYM_GEN_B(struct SYM_FWB_SCR, data_io) -#endif SYM_GEN_B(struct SYM_FWB_SCR, start64) SYM_GEN_B(struct SYM_FWB_SCR, pm_handle) };
drivers/scsi/sym53c8xx_2/sym_fw.h +0 -6
@@ -92,9 +92,6 @@ struct sym_fwa_ofs { };struct sym_fwb_ofs {SYM_GEN_FW_B (u_short) -#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN - SYM_GEN_B(u_short, data_io) -#endif SYM_GEN_B(u_short, start64) SYM_GEN_B(u_short, pm_handle) };
@@ -111,9 +108,6 @@ struct sym_fwa_ba { };struct sym_fwb_ba {SYM_GEN_FW_B (u32) -#ifdef SYM_OPT_HANDLE_DIR_UNKNOWN - SYM_GEN_B(u32, data_io) -#endif SYM_GEN_B(u32 ,start64 ); SYM_GEN_B(u32, pm_handle); };
drivers/scsi/sym53c8xx_2/sym_fw1.h +0 -48
60 lines not on this page · raw message
drivers/scsi/sym53c8xx_2/sym_fw2.h +0 -52
64 lines not on this page · raw message
drivers/scsi/sym53c8xx_2/sym_glue.c +36 -3
@@ -514,9 +514,10 @@ static inline int sym_setup_cdb(struct s*/ int sym_setup_data_and_start (struct sym_hcb *np,struct scsi_cmnd *cmd,struct sym_ccb *cp) { -int dir;struct sym_tcb *tp = &np->target[cp->target];struct sym_lcb *lp =sym_lp (tp, cp->lun); +u32 lastp, goalp; +int dir;/* * Build the CDB.
@@ -534,15 +535,47 @@ int sym_setup_data_and_start(struct sym_sym_set_cam_status (cmd,DID_ERROR ); goto out_abort; } + +/* +* No segments means no data. +*/ +if (!cp->segments) + dir =DMA_NONE ; }else { cp->data_len =0 ; cp->segments =0 ; }/* -* Set data pointers. +* Set the data pointer. +*/ +switch (dir) { +case DMA_BIDIRECTIONAL : +printk ("%s: got DMA_BIDIRECTIONAL command" ,sym_name (np)); +sym_set_cam_status (cmd,DID_ERROR ); + goto out_abort; +case DMA_TO_DEVICE : + goalp =SCRIPTA_BA (np, data_out2) +8 ; + lastp = goalp -8 - (cp->segments * (2 *4 )); +break ; +case DMA_FROM_DEVICE : + cp->host_flags |=HF_DATA_IN ; + goalp =SCRIPTA_BA (np, data_in2) +8 ; + lastp = goalp -8 - (cp->segments * (2 *4 )); +break ; +case DMA_NONE : +default : + lastp = goalp =SCRIPTB_BA (np, no_data); +break ; + } + +/* +* Set all pointers values needed by SCRIPTS. */ -sym_setup_data_pointers (np, cp, dir); + cp->phys.head.lastp =cpu_to_scr (lastp); + cp->phys.head.savep =cpu_to_scr (lastp); + cp->startp = cp->phys.head.savep; + cp->goalp =cpu_to_scr (goalp);/* * When `#ifed 1', the code below makes the driver
drivers/scsi/sym53c8xx_2/sym_glue.h +0 -1
@@ -68,7 +68,6 @@*/ #define SYM_CONF_TIMER_INTERVAL ((HZ+1)/2) -#define SYM_OPT_HANDLE_DIR_UNKNOWN #define SYM_OPT_HANDLE_DEVICE_QUEUEING #define SYM_OPT_LIMIT_COMMAND_REORDERING
drivers/scsi/sym53c8xx_2/sym_hipd.c +4 -4
@@ -3654,7 +3654,7 @@ static int sym_evaluate_dp(struct sym_hc* If result is dp_sg = SYM_CONF_MAX_SG, then we are at the * end of the data. */ - tmp =scr_to_cpu (sym_goalp (cp)); + tmp =scr_to_cpu (cp->goalp); dp_sg =SYM_CONF_MAX_SG ;if (dp_scr != tmp) dp_sg -= (tmp -8 - (int )dp_scr) / (2 *4 );
@@ -3761,7 +3761,7 @@ static void sym_modify_dp(struct sym_hcb* And our alchemy:) allows to easily calculate the data * script address we want to return for the next data phase. */ - dp_ret =cpu_to_scr (sym_goalp (cp)); + dp_ret =cpu_to_scr (cp->goalp); dp_ret = dp_ret -8 - (SYM_CONF_MAX_SG - dp_sg) * (2 *4 );/*
@@ -3857,7 +3857,7 @@ int sym_compute_residual(struct sym_hcb* If all data has been transferred, * there is no residual. */ -if (cp->phys.head.lastp ==sym_goalp (cp)) +if (cp->phys.head.lastp == cp->goalp)return resid;/*
@@ -5470,7 +5470,7 @@ void sym_complete_ok (struct sym_hcb *np* extended error did occur, there is no residual. */ resid =0 ; -if (cp->phys.head.lastp !=sym_goalp (cp)) +if (cp->phys.head.lastp != cp->goalp) resid =sym_compute_residual (np, cp);/*
drivers/scsi/sym53c8xx_2/sym_hipd.h +0 -84
120 lines not on this page · raw message
---
0.99.9.GIT
PATCH 5/11 Use DMA_40BIT_MASK constant
In reply to Matthew WilcoxNow that this constant has been added to dma-mapping.h, we don't need our own definition
---
drivers/scsi/sym53c8xx_2/sym_glue.c | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
applies-to: 373e17c364b620aacf967bc5a672dc2f544edf45 4ffa94c6b6bf4b80857e22fb0a2813e4b3298402
drivers/scsi/sym53c8xx_2/sym_glue.c +1 -1
@@ -1532,7 +1532,7 @@ static int sym_setup_bus_dma_mask(struct {#if SYM_CONF_DMA_ADDRESSING_MODE >0 #if SYM_CONF_DMA_ADDRESSING_MODE ==1 -#define DMA_DAC_MASK 0x000000ffffffffffULL/* 40-bit */ +#define DMA_DAC_MASK DMA_40BIT_MASK#elif SYM_CONF_DMA_ADDRESSING_MODE ==2 #define DMA_DAC_MASK DMA_64BIT_MASK#endif
---
0.99.9.GIT
PATCH 6/11 Disable IU and QAS negotiation
In reply to Matthew WilcoxEnabling these features causes problems with some drives, so disable them until they're debugged
---
drivers/scsi/sym53c8xx_2/sym_glue.c | 5 ++++- 1 files changed, 4 insertions(+), 1 deletions(-)
applies-to: 4cb76e47503c6282ad75599ccc17f19d74a8c010 adf11e5111a559aedf0160ebd56708b625ca38d4
drivers/scsi/sym53c8xx_2/sym_glue.c +4 -1
@@ -2122,6 +2122,7 @@ static void sym2_set_dt(struct scsi_targ tp->tgoal.check_nego =1 ; } +#if 0 static void sym2_set_iu (struct scsi_target *starget,int iu) {struct Scsi_Host *shost =dev_to_shost (starget->dev.parent);
@@ -2147,7 +2148,7 @@ static void sym2_set_qas(struct scsi_tar tp->tgoal.qas =0 ; tp->tgoal.check_nego =1 ; } - +#endif static struct spi_function_template sym2_transport_functions = { .set_offset = sym2_set_offset,
@@ -2158,10 +2159,12 @@ static struct spi_function_template sym2 .show_width = 1, .set_dt = sym2_set_dt, .show_dt =1 , +#if 0 .set_iu = sym2_set_iu, .show_iu = 1, .set_qas = sym2_set_qas, .show_qas = 1, +#endif .get_signalling = sym2_get_signalling, };
---
0.99.9.GIT
PATCH 7/11 Negotiate correctly with async-only devices
In reply to Matthew WilcoxWhen we got a device only capable of async, we would zero out goal->period which would cause us to try PPR negotiations. Leave goal->period alone, and check goal->offset before doing PPR. Kudos to Daniel Forsgren for figuring this out.
---
drivers/scsi/sym53c8xx_2/sym_hipd.c | 4 ++-- 1 files changed, 2 insertions(+), 2 deletions(-)
applies-to: 9313e174962281a1344bfe2e43457b1e8d1b6083 719898c8be5a1acdd48dfaf60a337e1b36c32a59
drivers/scsi/sym53c8xx_2/sym_hipd.c +2 -2
@@ -1405,7 +1405,6 @@ static void sym_check_goals(struct sym_h goal->iu =0 ; goal->dt =0 ; goal->qas =0 ; - goal->period =0 ; goal->offset =0 ;return ; }
@@ -1465,7 +1464,8 @@ static int sym_prepare_nego(struct sym_h* Many devices implement PPR in a buggy way, so only use it if we * really want to. */ -if (goal->iu || goal->dt || goal->qas || (goal->period <0xa )) { +if (goal->offset && + (goal->iu || goal->dt || goal->qas || (goal->period <0xa ))) { nego =NS_PPR ; }else if (spi_width (starget) != goal->width) { nego =NS_WIDE ;
---
0.99.9.GIT
PATCH 8/11 Use scsi_print_msg
In reply to Matthew Wilcoxsym_show_msg was almost a duplicate of scsi_print_msg, except not as featureful. So use the common code instead.
---
drivers/scsi/sym53c8xx_2/sym_hipd.c | 29 +++++------------------------ 1 files changed, 5 insertions(+), 24 deletions(-)
applies-to: eae46886d0779efc27461f36450ee16cbf776e29 b8a84ef674909ad4f46015e2ad9c512e17ecc6d3
drivers/scsi/sym53c8xx_2/sym_hipd.c +5 -24
@@ -40,6 +40,7 @@#include <linux/slab.h> #include <asm/param.h> /* for timeouts in units of HZ */ +#include <scsi/scsi_dbg.h> #include "sym_glue.h" #include "sym_nvram.h"
@@ -70,32 +71,12 @@ static void sym_printl_hex(u_char *p, inprintf (".\n" ); } -/* -* Print out the content of a SCSI message. -*/ -static int sym_show_msg (u_char * msg) -{ -u_char i; -printf ("%x" ,*msg); -if (*msg==M_EXTENDED ) { -for (i=1 ;i<8 ;i++) { -if (i-1 >msg[1 ])break ; -printf ("-%x" ,msg[i]); - } -return (i+1 ); - }else if ((*msg &0xf0 ) ==0x20 ) { -printf ("-%x" ,msg[1 ]); -return (2 ); - } -return (1 ); -} -static void sym_print_msg (struct sym_ccb *cp,char *label,u_char *msg) {sym_print_addr (cp->cmd,"%s: " , label); -sym_show_msg (msg); -printf (".\n" ); +scsi_print_msg (msg); +printf ("\n" ); }static void sym_print_nego_msg (struct sym_hcb *np,int target,char *label,u_char *msg)
@@ -103,8 +84,8 @@ static void sym_print_nego_msg(struct systruct sym_tcb *tp = &np->target[target];dev_info (&tp->starget->dev,"%s: " , label); -sym_show_msg (msg); -printf (".\n" ); +scsi_print_msg (msg); +printf ("\n" ); }/*
---
0.99.9.GIT
PATCH 9/11 Allow NVRAM settings to limit speed and width
In reply to Matthew WilcoxThe NVRAM for both Tekram and Symbios boards allows the user to set the speed and width for individual targets. I took that code out in March 2004 when we introduced Domain Validation, but it seems there's still a legitimate need for it in some configurations.
---
drivers/scsi/sym53c8xx_2/sym_glue.c | 3 +++ drivers/scsi/sym53c8xx_2/sym_hipd.c | 2 +- drivers/scsi/sym53c8xx_2/sym_hipd.h | 6 ++++-- drivers/scsi/sym53c8xx_2/sym_nvram.c | 29 ++++++++++++++++------------- drivers/scsi/sym53c8xx_2/sym_nvram.h | 4 ++-- 5 files changed, 26 insertions(+), 18 deletions(-)
applies-to: c8f292d80746e13d8d2eefc2bc500622e1c67c87 334ca2a5a0cd5d4e8b5d68ce81ef1baa0acd3cbc
drivers/scsi/sym53c8xx_2/sym_glue.c +3 -0
@@ -1038,6 +1038,9 @@ static int sym53c8xx_slave_alloc(structreturn -ENOMEM ; tp->starget = sdev->sdev_target; +spi_min_period (tp->starget) = tp->usr_period; +spi_max_width (tp->starget) = tp->usr_width; +return 0 ; }
drivers/scsi/sym53c8xx_2/sym_hipd.c +1 -1
@@ -943,7 +943,7 @@ static int sym_prepare_setting(struct Sc tp->usrflags |= (SYM_DISC_ENABLED |SYM_TAGS_ENABLED ); tp->usrtags =SYM_SETUP_MAX_TAG ; -sym_nvram_setup_target (np, i, nvram); +sym_nvram_setup_target (tp, i, nvram);if (!tp->usrtags) tp->usrflags &= ~SYM_TAGS_ENABLED ;
drivers/scsi/sym53c8xx_2/sym_hipd.h +4 -2
@@ -434,8 +434,10 @@ struct sym_tcb {* Other user settable limits and options. * These limits are read from the NVRAM if present. */ -u_char usrflags; -u_short usrtags; +unsigned char usrflags; +unsigned char usr_period; +unsigned char usr_width; +unsigned short usrtags;struct scsi_target *starget; };
drivers/scsi/sym53c8xx_2/sym_nvram.c +16 -13
@@ -92,29 +92,32 @@ void sym_nvram_setup_host(struct Scsi_Ho* Get target set-up from Symbios format NVRAM. */ static void -sym_Symbios_setup_target (struct sym_hcb *np,int target,Symbios_nvram *nvram) +sym_Symbios_setup_target (struct sym_tcb *tp,int target,Symbios_nvram *nvram) { -struct sym_tcb *tp = &np->target[target];Symbios_target *tn = &nvram->target[target]; - tp->usrtags = - (tn->flags &SYMBIOS_QUEUE_TAGS_ENABLED )?SYM_SETUP_MAX_TAG :0 ; - +if (!(tn->flags &SYMBIOS_QUEUE_TAGS_ENABLED )) + tp->usrtags =0 ;if (!(tn->flags &SYMBIOS_DISCONNECT_ENABLE )) tp->usrflags &= ~SYM_DISC_ENABLED ;if (!(tn->flags &SYMBIOS_SCAN_AT_BOOT_TIME )) tp->usrflags |=SYM_SCAN_BOOT_DISABLED ;if (!(tn->flags &SYMBIOS_SCAN_LUNS )) tp->usrflags |=SYM_SCAN_LUNS_DISABLED ; + tp->usr_period = (tn->sync_period +3 ) /4 ; + tp->usr_width = (tn->bus_width ==0x8 ) ?0 :1 ; } +static const unsigned char Tekram_sync[16 ] = { +25 ,31 ,37 ,43 ,50 ,62 ,75 ,125 ,12 ,15 ,18 ,21 ,6 ,7 ,9 ,10 +}; +/* * Get target set-up from Tekram format NVRAM. */ static void -sym_Tekram_setup_target (struct sym_hcb *np,int target,Tekram_nvram *nvram) +sym_Tekram_setup_target (struct sym_tcb *tp,int target,Tekram_nvram *nvram) { -struct sym_tcb *tp = &np->target[target];struct Tekram_target *tn = &nvram->target[target];if (tn->flags &TEKRAM_TAGGED_COMMANDS ) {
@@ -124,22 +127,22 @@ sym_Tekram_setup_target(struct sym_hcb *if (tn->flags &TEKRAM_DISCONNECT_ENABLE ) tp->usrflags |=SYM_DISC_ENABLED ; -/* If any device does not support parity, we will not use this option */ -if (!(tn->flags &TEKRAM_PARITY_CHECK )) - np->rv_scntl0 &= ~0x0a ;/* SCSI parity checking disabled */ +if (tn->flags &TEKRAM_SYNC_NEGO ) + tp->usr_period = Tekram_sync[tn->sync_index &0xf ]; + tp->usr_width = (tn->flags &TEKRAM_WIDE_NEGO ) ?1 :0 ; }/* * Get target setup from NVRAM. */ -void sym_nvram_setup_target (struct sym_hcb *np,int target,struct sym_nvram *nvp) +void sym_nvram_setup_target (struct sym_tcb *tp,int target,struct sym_nvram *nvp) {switch (nvp->type) {case SYM_SYMBIOS_NVRAM : -sym_Symbios_setup_target (np, target, &nvp->data.Symbios); +sym_Symbios_setup_target (tp, target, &nvp->data.Symbios);break ;case SYM_TEKRAM_NVRAM : -sym_Tekram_setup_target (np, target, &nvp->data.Tekram); +sym_Tekram_setup_target (tp, target, &nvp->data.Tekram);break ;default :break ;
drivers/scsi/sym53c8xx_2/sym_nvram.h +2 -2
@@ -194,12 +194,12 @@ struct sym_nvram {#if SYM_CONF_NVRAM_SUPPORT void sym_nvram_setup_host (struct Scsi_Host *shost,struct sym_hcb *np,struct sym_nvram *nvram); -void sym_nvram_setup_target (struct sym_hcb *np,int target,struct sym_nvram *nvp); +void sym_nvram_setup_target (struct sym_tcb *tp,int target,struct sym_nvram *nvp);int sym_read_nvram (struct sym_device *np,struct sym_nvram *nvp);char *sym_nvram_type (struct sym_nvram *nvp);#else static inline void sym_nvram_setup_host (struct Scsi_Host *shost,struct sym_hcb *np,struct sym_nvram *nvram) { } -static inline void sym_nvram_setup_target (struct sym_hcb *np,struct sym_nvram *nvram) { } +static inline void sym_nvram_setup_target (struct sym_tcb *tp,struct sym_nvram *nvram) { }static inline int sym_read_nvram (struct sym_device *np,struct sym_nvram *nvp) { nvp->type =0 ;
---
0.99.9.GIT
PATCH 10/11 Report disabled devices and LUNs more attractively
In reply to Matthew WilcoxRather than print a list of targets at driver init time, print each disabled target as we attempt to scan it.
---
drivers/scsi/sym53c8xx_2/sym_glue.c | 14 +++++++++++--- drivers/scsi/sym53c8xx_2/sym_hipd.c | 30 ------------------------------ 2 files changed, 11 insertions(+), 33 deletions(-)
applies-to: 4ce895552fb045694ebbcf767bf85eeecaa6331a 2d9e3ce82a8a754cf84be377165dc7214944e55b
drivers/scsi/sym53c8xx_2/sym_glue.c +11 -3
@@ -1018,6 +1018,7 @@ static int sym53c8xx_slave_alloc(structif (sdev->id >=SYM_CONF_MAX_TARGET || sdev->lun >=SYM_CONF_MAX_LUN )return -ENXIO ; + tp->starget = sdev->sdev_target;/* * Fail the device init if the device is flagged NOSCAN at BOOT in * the NVRAM. This may speed up boot and maintain coherency with
@@ -1027,17 +1028,24 @@ static int sym53c8xx_slave_alloc(struct* lun devices behave badly when asked for a non zero LUN. */ -if ((tp->usrflags &SYM_SCAN_BOOT_DISABLED ) || - ((tp->usrflags &SYM_SCAN_LUNS_DISABLED ) && sdev->lun !=0 )) { +if (tp->usrflags &SYM_SCAN_BOOT_DISABLED ) { tp->usrflags &= ~SYM_SCAN_BOOT_DISABLED ; +starget_printk (KERN_INFO , tp->starget, +"Scan at boot disabled in NVRAM\n" );return -ENXIO ; } +if (tp->usrflags &SYM_SCAN_LUNS_DISABLED ) { +if (sdev->lun !=0 ) +return -ENXIO ; +starget_printk (KERN_INFO , tp->starget, +"Multiple LUNs disabled in NVRAM\n" ); + } + lp =sym_alloc_lcb (np, sdev->id, sdev->lun);if (!lp)return -ENOMEM ; - tp->starget = sdev->sdev_target;spi_min_period (tp->starget) = tp->usr_period;spi_max_width (tp->starget) = tp->usr_width;
drivers/scsi/sym53c8xx_2/sym_hipd.c +0 -30
@@ -616,29 +616,6 @@ static __inline void sym_init_burst(stru } } - -/* -* Print out the list of targets that have some flag disabled by user. -*/ -static void sym_print_targets_flag (struct sym_hcb *np,int mask,char *msg) -{ -int cnt; -int i; - -for (cnt =0 , i =0 ; i <SYM_CONF_MAX_TARGET ; i++) { -if (i == np->myaddr) -continue ; -if (np->target[i].usrflags & mask) { -if (!cnt++) -printf ("%s: %s disabled for targets" , -sym_name (np), msg); -printf (" %d" , i); - } - } -if (cnt) -printf (".\n" ); -} -/* * Save initial settings of some IO registers. * Assumed to have been set by BIOS.
@@ -986,13 +963,6 @@ static int sym_prepare_setting(struct Scsym_name (np), np->rv_scntl3, np->rv_dmode, np->rv_dcntl, np->rv_ctest3, np->rv_ctest4, np->rv_ctest5); } -/* -* Let user be aware of targets that have some disable flags set. -*/ -sym_print_targets_flag (np,SYM_SCAN_BOOT_DISABLED ,"SCAN AT BOOT" ); -if (sym_verbose) -sym_print_targets_flag (np,SYM_SCAN_LUNS_DISABLED , -"SCAN FOR LUNS" );return 0 ; }
---
0.99.9.GIT
PATCH 11/11 Version 2.2.2
In reply to Matthew WilcoxUpdate version number to 2.2.2
---
drivers/scsi/sym53c8xx_2/sym_defs.h | 2 +- 1 files changed, 1 insertions(+), 1 deletions(-)
applies-to: b2994307e48f50543720b3e4320e87e3f55bad8d ad290715ebb20c006171eb297de81111c5ddf348
drivers/scsi/sym53c8xx_2/sym_defs.h +1 -1
@@ -40,7 +40,7 @@#ifndef SYM_DEFS_H #define SYM_DEFS_H -#define SYM_VERSION "2.2.1" +#define SYM_VERSION "2.2.2"#define SYM_DRIVER_NAME "sym-" SYM_VERSION/*
---
0.99.9.GIT