diff options
Diffstat (limited to 'drivers/scsi/sym53c8xx_2/sym_hipd.c')
-rw-r--r-- | drivers/scsi/sym53c8xx_2/sym_hipd.c | 49 |
1 files changed, 48 insertions, 1 deletions
diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.c b/drivers/scsi/sym53c8xx_2/sym_hipd.c index ffa70d1ed182..69ad4945c936 100644 --- a/drivers/scsi/sym53c8xx_2/sym_hipd.c +++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c | |||
@@ -1896,6 +1896,15 @@ void sym_start_up(struct Scsi_Host *shost, int reason) | |||
1896 | tp->head.sval = 0; | 1896 | tp->head.sval = 0; |
1897 | tp->head.wval = np->rv_scntl3; | 1897 | tp->head.wval = np->rv_scntl3; |
1898 | tp->head.uval = 0; | 1898 | tp->head.uval = 0; |
1899 | if (tp->lun0p) | ||
1900 | tp->lun0p->to_clear = 0; | ||
1901 | if (tp->lunmp) { | ||
1902 | int ln; | ||
1903 | |||
1904 | for (ln = 1; ln < SYM_CONF_MAX_LUN; ln++) | ||
1905 | if (tp->lunmp[ln]) | ||
1906 | tp->lunmp[ln]->to_clear = 0; | ||
1907 | } | ||
1899 | } | 1908 | } |
1900 | 1909 | ||
1901 | /* | 1910 | /* |
@@ -4988,7 +4997,7 @@ struct sym_lcb *sym_alloc_lcb (struct sym_hcb *np, u_char tn, u_char ln) | |||
4988 | */ | 4997 | */ |
4989 | if (ln && !tp->lunmp) { | 4998 | if (ln && !tp->lunmp) { |
4990 | tp->lunmp = kcalloc(SYM_CONF_MAX_LUN, sizeof(struct sym_lcb *), | 4999 | tp->lunmp = kcalloc(SYM_CONF_MAX_LUN, sizeof(struct sym_lcb *), |
4991 | GFP_KERNEL); | 5000 | GFP_ATOMIC); |
4992 | if (!tp->lunmp) | 5001 | if (!tp->lunmp) |
4993 | goto fail; | 5002 | goto fail; |
4994 | } | 5003 | } |
@@ -5008,6 +5017,7 @@ struct sym_lcb *sym_alloc_lcb (struct sym_hcb *np, u_char tn, u_char ln) | |||
5008 | tp->lun0p = lp; | 5017 | tp->lun0p = lp; |
5009 | tp->head.lun0_sa = cpu_to_scr(vtobus(lp)); | 5018 | tp->head.lun0_sa = cpu_to_scr(vtobus(lp)); |
5010 | } | 5019 | } |
5020 | tp->nlcb++; | ||
5011 | 5021 | ||
5012 | /* | 5022 | /* |
5013 | * Let the itl task point to error handling. | 5023 | * Let the itl task point to error handling. |
@@ -5085,6 +5095,43 @@ fail: | |||
5085 | } | 5095 | } |
5086 | 5096 | ||
5087 | /* | 5097 | /* |
5098 | * Lun control block deallocation. Returns the number of valid remaing LCBs | ||
5099 | * for the target. | ||
5100 | */ | ||
5101 | int sym_free_lcb(struct sym_hcb *np, u_char tn, u_char ln) | ||
5102 | { | ||
5103 | struct sym_tcb *tp = &np->target[tn]; | ||
5104 | struct sym_lcb *lp = sym_lp(tp, ln); | ||
5105 | |||
5106 | tp->nlcb--; | ||
5107 | |||
5108 | if (ln) { | ||
5109 | if (!tp->nlcb) { | ||
5110 | kfree(tp->lunmp); | ||
5111 | sym_mfree_dma(tp->luntbl, 256, "LUNTBL"); | ||
5112 | tp->lunmp = NULL; | ||
5113 | tp->luntbl = NULL; | ||
5114 | tp->head.luntbl_sa = cpu_to_scr(vtobus(np->badluntbl)); | ||
5115 | } else { | ||
5116 | tp->luntbl[ln] = cpu_to_scr(vtobus(&np->badlun_sa)); | ||
5117 | tp->lunmp[ln] = NULL; | ||
5118 | } | ||
5119 | } else { | ||
5120 | tp->lun0p = NULL; | ||
5121 | tp->head.lun0_sa = cpu_to_scr(vtobus(&np->badlun_sa)); | ||
5122 | } | ||
5123 | |||
5124 | if (lp->itlq_tbl) { | ||
5125 | sym_mfree_dma(lp->itlq_tbl, SYM_CONF_MAX_TASK*4, "ITLQ_TBL"); | ||
5126 | kfree(lp->cb_tags); | ||
5127 | } | ||
5128 | |||
5129 | sym_mfree_dma(lp, sizeof(*lp), "LCB"); | ||
5130 | |||
5131 | return tp->nlcb; | ||
5132 | } | ||
5133 | |||
5134 | /* | ||
5088 | * Queue a SCSI IO to the controller. | 5135 | * Queue a SCSI IO to the controller. |
5089 | */ | 5136 | */ |
5090 | int sym_queue_scsiio(struct sym_hcb *np, struct scsi_cmnd *cmd, struct sym_ccb *cp) | 5137 | int sym_queue_scsiio(struct sym_hcb *np, struct scsi_cmnd *cmd, struct sym_ccb *cp) |