Commit 26145f7e authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6

* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6:
  [SCSI] NCR5380: Fix bugs and canonicalize irq handler usage
  [SCSI] zfcp: fix cleanup of dismissed error recovery actions
  [SCSI] zfcp: fix dismissal of error recovery actions
  [SCSI] qla1280: convert to use the data buffer accessors
  [SCSI] iscsi: return data transfer residual for data-out commands
  [SCSI] iscsi_tcp: fix potential lockup with write commands
  [SCSI] aacraid: fix security weakness
  [SCSI] aacraid: fix up le32 issues in BlinkLED
  [SCSI] aacraid: fix potential panic in thread stop
  [SCSI] aacraid: don't assign cpu_to_le32(constant) to u8
parents 8002cedc 1e641664
...@@ -977,7 +977,9 @@ static void zfcp_erp_action_dismiss(struct zfcp_erp_action *erp_action) ...@@ -977,7 +977,9 @@ static void zfcp_erp_action_dismiss(struct zfcp_erp_action *erp_action)
debug_text_event(adapter->erp_dbf, 2, "a_adis"); debug_text_event(adapter->erp_dbf, 2, "a_adis");
debug_event(adapter->erp_dbf, 2, &erp_action->action, sizeof (int)); debug_event(adapter->erp_dbf, 2, &erp_action->action, sizeof (int));
zfcp_erp_async_handler_nolock(erp_action, ZFCP_STATUS_ERP_DISMISSED); erp_action->status |= ZFCP_STATUS_ERP_DISMISSED;
if (zfcp_erp_action_exists(erp_action) == ZFCP_ERP_ACTION_RUNNING)
zfcp_erp_action_ready(erp_action);
} }
int int
...@@ -1063,7 +1065,7 @@ zfcp_erp_thread(void *data) ...@@ -1063,7 +1065,7 @@ zfcp_erp_thread(void *data)
&adapter->status)) { &adapter->status)) {
write_lock_irqsave(&adapter->erp_lock, flags); write_lock_irqsave(&adapter->erp_lock, flags);
next = adapter->erp_ready_head.prev; next = adapter->erp_ready_head.next;
write_unlock_irqrestore(&adapter->erp_lock, flags); write_unlock_irqrestore(&adapter->erp_lock, flags);
if (next != &adapter->erp_ready_head) { if (next != &adapter->erp_ready_head) {
...@@ -1153,15 +1155,13 @@ zfcp_erp_strategy(struct zfcp_erp_action *erp_action) ...@@ -1153,15 +1155,13 @@ zfcp_erp_strategy(struct zfcp_erp_action *erp_action)
/* /*
* check for dismissed status again to avoid follow-up actions, * check for dismissed status again to avoid follow-up actions,
* failing of targets and so on for dismissed actions * failing of targets and so on for dismissed actions,
* we go through down() here because there has been an up()
*/ */
retval = zfcp_erp_strategy_check_action(erp_action, retval); if (erp_action->status & ZFCP_STATUS_ERP_DISMISSED)
retval = ZFCP_ERP_CONTINUES;
switch (retval) { switch (retval) {
case ZFCP_ERP_DISMISSED:
/* leave since this action has ridden to its ancestors */
debug_text_event(adapter->erp_dbf, 6, "a_st_dis2");
goto unlock;
case ZFCP_ERP_NOMEM: case ZFCP_ERP_NOMEM:
/* no memory to continue immediately, let it sleep */ /* no memory to continue immediately, let it sleep */
if (!(erp_action->status & ZFCP_STATUS_ERP_LOWMEM)) { if (!(erp_action->status & ZFCP_STATUS_ERP_LOWMEM)) {
...@@ -3089,7 +3089,7 @@ zfcp_erp_action_enqueue(int action, ...@@ -3089,7 +3089,7 @@ zfcp_erp_action_enqueue(int action,
++adapter->erp_total_count; ++adapter->erp_total_count;
/* finally put it into 'ready' queue and kick erp thread */ /* finally put it into 'ready' queue and kick erp thread */
list_add(&erp_action->list, &adapter->erp_ready_head); list_add_tail(&erp_action->list, &adapter->erp_ready_head);
up(&adapter->erp_ready_sem); up(&adapter->erp_ready_sem);
retval = 0; retval = 0;
out: out:
......
...@@ -1339,10 +1339,10 @@ int aac_check_health(struct aac_dev * aac) ...@@ -1339,10 +1339,10 @@ int aac_check_health(struct aac_dev * aac)
aif = (struct aac_aifcmd *)hw_fib->data; aif = (struct aac_aifcmd *)hw_fib->data;
aif->command = cpu_to_le32(AifCmdEventNotify); aif->command = cpu_to_le32(AifCmdEventNotify);
aif->seqnum = cpu_to_le32(0xFFFFFFFF); aif->seqnum = cpu_to_le32(0xFFFFFFFF);
aif->data[0] = cpu_to_le32(AifEnExpEvent); aif->data[0] = AifEnExpEvent;
aif->data[1] = cpu_to_le32(AifExeFirmwarePanic); aif->data[1] = AifExeFirmwarePanic;
aif->data[2] = cpu_to_le32(AifHighPriority); aif->data[2] = AifHighPriority;
aif->data[3] = cpu_to_le32(BlinkLED); aif->data[3] = BlinkLED;
/* /*
* Put the FIB onto the * Put the FIB onto the
......
...@@ -636,7 +636,7 @@ static int aac_cfg_open(struct inode *inode, struct file *file) ...@@ -636,7 +636,7 @@ static int aac_cfg_open(struct inode *inode, struct file *file)
static int aac_cfg_ioctl(struct inode *inode, struct file *file, static int aac_cfg_ioctl(struct inode *inode, struct file *file,
unsigned int cmd, unsigned long arg) unsigned int cmd, unsigned long arg)
{ {
if (!capable(CAP_SYS_ADMIN)) if (!capable(CAP_SYS_RAWIO))
return -EPERM; return -EPERM;
return aac_do_ioctl(file->private_data, cmd, (void __user *)arg); return aac_do_ioctl(file->private_data, cmd, (void __user *)arg);
} }
...@@ -691,7 +691,7 @@ static int aac_compat_ioctl(struct scsi_device *sdev, int cmd, void __user *arg) ...@@ -691,7 +691,7 @@ static int aac_compat_ioctl(struct scsi_device *sdev, int cmd, void __user *arg)
static long aac_compat_cfg_ioctl(struct file *file, unsigned cmd, unsigned long arg) static long aac_compat_cfg_ioctl(struct file *file, unsigned cmd, unsigned long arg)
{ {
if (!capable(CAP_SYS_ADMIN)) if (!capable(CAP_SYS_RAWIO))
return -EPERM; return -EPERM;
return aac_compat_do_ioctl((struct aac_dev *)file->private_data, cmd, arg); return aac_compat_do_ioctl((struct aac_dev *)file->private_data, cmd, arg);
} }
...@@ -950,7 +950,8 @@ static struct scsi_host_template aac_driver_template = { ...@@ -950,7 +950,8 @@ static struct scsi_host_template aac_driver_template = {
static void __aac_shutdown(struct aac_dev * aac) static void __aac_shutdown(struct aac_dev * aac)
{ {
kthread_stop(aac->thread); if (aac->aif_thread)
kthread_stop(aac->thread);
aac_send_shutdown(aac); aac_send_shutdown(aac);
aac_adapter_disable_int(aac); aac_adapter_disable_int(aac);
free_irq(aac->pdev->irq, aac); free_irq(aac->pdev->irq, aac);
......
...@@ -393,7 +393,7 @@ static irqreturn_t scsi_tt_intr(int irq, void *dummy) ...@@ -393,7 +393,7 @@ static irqreturn_t scsi_tt_intr(int irq, void *dummy)
#endif /* REAL_DMA */ #endif /* REAL_DMA */
NCR5380_intr(0, 0); NCR5380_intr(irq, dummy);
#if 0 #if 0
/* To be sure the int is not masked */ /* To be sure the int is not masked */
...@@ -458,7 +458,7 @@ static irqreturn_t scsi_falcon_intr(int irq, void *dummy) ...@@ -458,7 +458,7 @@ static irqreturn_t scsi_falcon_intr(int irq, void *dummy)
#endif /* REAL_DMA */ #endif /* REAL_DMA */
NCR5380_intr(0, 0); NCR5380_intr(irq, dummy);
return IRQ_HANDLED; return IRQ_HANDLED;
} }
...@@ -684,7 +684,7 @@ int atari_scsi_detect(struct scsi_host_template *host) ...@@ -684,7 +684,7 @@ int atari_scsi_detect(struct scsi_host_template *host)
* interrupt after having cleared the pending flag for the DMA * interrupt after having cleared the pending flag for the DMA
* interrupt. */ * interrupt. */
if (request_irq(IRQ_TT_MFP_SCSI, scsi_tt_intr, IRQ_TYPE_SLOW, if (request_irq(IRQ_TT_MFP_SCSI, scsi_tt_intr, IRQ_TYPE_SLOW,
"SCSI NCR5380", scsi_tt_intr)) { "SCSI NCR5380", instance)) {
printk(KERN_ERR "atari_scsi_detect: cannot allocate irq %d, aborting",IRQ_TT_MFP_SCSI); printk(KERN_ERR "atari_scsi_detect: cannot allocate irq %d, aborting",IRQ_TT_MFP_SCSI);
scsi_unregister(atari_scsi_host); scsi_unregister(atari_scsi_host);
atari_stram_free(atari_dma_buffer); atari_stram_free(atari_dma_buffer);
...@@ -701,7 +701,7 @@ int atari_scsi_detect(struct scsi_host_template *host) ...@@ -701,7 +701,7 @@ int atari_scsi_detect(struct scsi_host_template *host)
IRQ_TYPE_PRIO, "Hades DMA emulator", IRQ_TYPE_PRIO, "Hades DMA emulator",
hades_dma_emulator)) { hades_dma_emulator)) {
printk(KERN_ERR "atari_scsi_detect: cannot allocate irq %d, aborting (MACH_IS_HADES)",IRQ_AUTO_2); printk(KERN_ERR "atari_scsi_detect: cannot allocate irq %d, aborting (MACH_IS_HADES)",IRQ_AUTO_2);
free_irq(IRQ_TT_MFP_SCSI, scsi_tt_intr); free_irq(IRQ_TT_MFP_SCSI, instance);
scsi_unregister(atari_scsi_host); scsi_unregister(atari_scsi_host);
atari_stram_free(atari_dma_buffer); atari_stram_free(atari_dma_buffer);
atari_dma_buffer = 0; atari_dma_buffer = 0;
...@@ -761,7 +761,7 @@ int atari_scsi_detect(struct scsi_host_template *host) ...@@ -761,7 +761,7 @@ int atari_scsi_detect(struct scsi_host_template *host)
int atari_scsi_release(struct Scsi_Host *sh) int atari_scsi_release(struct Scsi_Host *sh)
{ {
if (IS_A_TT()) if (IS_A_TT())
free_irq(IRQ_TT_MFP_SCSI, scsi_tt_intr); free_irq(IRQ_TT_MFP_SCSI, sh);
if (atari_dma_buffer) if (atari_dma_buffer)
atari_stram_free(atari_dma_buffer); atari_stram_free(atari_dma_buffer);
return 1; return 1;
......
...@@ -277,7 +277,8 @@ found: ...@@ -277,7 +277,8 @@ found:
/* With interrupts enabled, it will sometimes hang when doing heavy /* With interrupts enabled, it will sometimes hang when doing heavy
* reads. So better not enable them until I finger it out. */ * reads. So better not enable them until I finger it out. */
if (instance->irq != SCSI_IRQ_NONE) if (instance->irq != SCSI_IRQ_NONE)
if (request_irq(instance->irq, dtc_intr, IRQF_DISABLED, "dtc", instance)) { if (request_irq(instance->irq, dtc_intr, IRQF_DISABLED,
"dtc", instance)) {
printk(KERN_ERR "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); printk(KERN_ERR "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq);
instance->irq = SCSI_IRQ_NONE; instance->irq = SCSI_IRQ_NONE;
} }
...@@ -459,7 +460,7 @@ static int dtc_release(struct Scsi_Host *shost) ...@@ -459,7 +460,7 @@ static int dtc_release(struct Scsi_Host *shost)
NCR5380_local_declare(); NCR5380_local_declare();
NCR5380_setup(shost); NCR5380_setup(shost);
if (shost->irq) if (shost->irq)
free_irq(shost->irq, NULL); free_irq(shost->irq, shost);
NCR5380_exit(shost); NCR5380_exit(shost);
if (shost->io_port && shost->n_io_port) if (shost->io_port && shost->n_io_port)
release_region(shost->io_port, shost->n_io_port); release_region(shost->io_port, shost->n_io_port);
......
...@@ -460,7 +460,8 @@ int __init generic_NCR5380_detect(struct scsi_host_template * tpnt) ...@@ -460,7 +460,8 @@ int __init generic_NCR5380_detect(struct scsi_host_template * tpnt)
instance->irq = NCR5380_probe_irq(instance, 0xffff); instance->irq = NCR5380_probe_irq(instance, 0xffff);
if (instance->irq != SCSI_IRQ_NONE) if (instance->irq != SCSI_IRQ_NONE)
if (request_irq(instance->irq, generic_NCR5380_intr, IRQF_DISABLED, "NCR5380", instance)) { if (request_irq(instance->irq, generic_NCR5380_intr,
IRQF_DISABLED, "NCR5380", instance)) {
printk(KERN_WARNING "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq); printk(KERN_WARNING "scsi%d : IRQ%d not free, interrupts disabled\n", instance->host_no, instance->irq);
instance->irq = SCSI_IRQ_NONE; instance->irq = SCSI_IRQ_NONE;
} }
...@@ -513,7 +514,7 @@ int generic_NCR5380_release_resources(struct Scsi_Host *instance) ...@@ -513,7 +514,7 @@ int generic_NCR5380_release_resources(struct Scsi_Host *instance)
NCR5380_setup(instance); NCR5380_setup(instance);
if (instance->irq != SCSI_IRQ_NONE) if (instance->irq != SCSI_IRQ_NONE)
free_irq(instance->irq, NULL); free_irq(instance->irq, instance);
NCR5380_exit(instance); NCR5380_exit(instance);
#ifndef CONFIG_SCSI_G_NCR5380_MEM #ifndef CONFIG_SCSI_G_NCR5380_MEM
......
This diff is collapsed.
...@@ -32,21 +32,21 @@ ...@@ -32,21 +32,21 @@
#define IN_PROGRESS_PAD_RECV 0x4 #define IN_PROGRESS_PAD_RECV 0x4
/* xmit state machine */ /* xmit state machine */
#define XMSTATE_IDLE 0x0 #define XMSTATE_VALUE_IDLE 0
#define XMSTATE_CMD_HDR_INIT 0x1 #define XMSTATE_BIT_CMD_HDR_INIT 0
#define XMSTATE_CMD_HDR_XMIT 0x2 #define XMSTATE_BIT_CMD_HDR_XMIT 1
#define XMSTATE_IMM_HDR 0x4 #define XMSTATE_BIT_IMM_HDR 2
#define XMSTATE_IMM_DATA 0x8 #define XMSTATE_BIT_IMM_DATA 3
#define XMSTATE_UNS_INIT 0x10 #define XMSTATE_BIT_UNS_INIT 4
#define XMSTATE_UNS_HDR 0x20 #define XMSTATE_BIT_UNS_HDR 5
#define XMSTATE_UNS_DATA 0x40 #define XMSTATE_BIT_UNS_DATA 6
#define XMSTATE_SOL_HDR 0x80 #define XMSTATE_BIT_SOL_HDR 7
#define XMSTATE_SOL_DATA 0x100 #define XMSTATE_BIT_SOL_DATA 8
#define XMSTATE_W_PAD 0x200 #define XMSTATE_BIT_W_PAD 9
#define XMSTATE_W_RESEND_PAD 0x400 #define XMSTATE_BIT_W_RESEND_PAD 10
#define XMSTATE_W_RESEND_DATA_DIGEST 0x800 #define XMSTATE_BIT_W_RESEND_DATA_DIGEST 11
#define XMSTATE_IMM_HDR_INIT 0x1000 #define XMSTATE_BIT_IMM_HDR_INIT 12
#define XMSTATE_SOL_HDR_INIT 0x2000 #define XMSTATE_BIT_SOL_HDR_INIT 13
#define ISCSI_PAD_LEN 4 #define ISCSI_PAD_LEN 4
#define ISCSI_SG_TABLESIZE SG_ALL #define ISCSI_SG_TABLESIZE SG_ALL
...@@ -122,7 +122,7 @@ struct iscsi_data_task { ...@@ -122,7 +122,7 @@ struct iscsi_data_task {
struct iscsi_tcp_mgmt_task { struct iscsi_tcp_mgmt_task {
struct iscsi_hdr hdr; struct iscsi_hdr hdr;
char hdrext[sizeof(__u32)]; /* Header-Digest */ char hdrext[sizeof(__u32)]; /* Header-Digest */
int xmstate; /* mgmt xmit progress */ unsigned long xmstate; /* mgmt xmit progress */
struct iscsi_buf headbuf; /* header buffer */ struct iscsi_buf headbuf; /* header buffer */
struct iscsi_buf sendbuf; /* in progress buffer */ struct iscsi_buf sendbuf; /* in progress buffer */
int sent; int sent;
...@@ -150,7 +150,7 @@ struct iscsi_tcp_cmd_task { ...@@ -150,7 +150,7 @@ struct iscsi_tcp_cmd_task {
int pad_count; /* padded bytes */ int pad_count; /* padded bytes */
struct iscsi_buf headbuf; /* header buf (xmit) */ struct iscsi_buf headbuf; /* header buf (xmit) */
struct iscsi_buf sendbuf; /* in progress buffer*/ struct iscsi_buf sendbuf; /* in progress buffer*/
int xmstate; /* xmit xtate machine */ unsigned long xmstate; /* xmit xtate machine */
int sent; int sent;
struct scatterlist *sg; /* per-cmd SG list */ struct scatterlist *sg; /* per-cmd SG list */
struct scatterlist *bad_sg; /* assert statement */ struct scatterlist *bad_sg; /* assert statement */
......
...@@ -291,9 +291,6 @@ invalid_datalen: ...@@ -291,9 +291,6 @@ invalid_datalen:
min_t(uint16_t, senselen, SCSI_SENSE_BUFFERSIZE)); min_t(uint16_t, senselen, SCSI_SENSE_BUFFERSIZE));
} }
if (sc->sc_data_direction == DMA_TO_DEVICE)
goto out;
if (rhdr->flags & ISCSI_FLAG_CMD_UNDERFLOW) { if (rhdr->flags & ISCSI_FLAG_CMD_UNDERFLOW) {
int res_count = be32_to_cpu(rhdr->residual_count); int res_count = be32_to_cpu(rhdr->residual_count);
......
...@@ -303,7 +303,7 @@ int macscsi_detect(struct scsi_host_template * tpnt) ...@@ -303,7 +303,7 @@ int macscsi_detect(struct scsi_host_template * tpnt)
if (instance->irq != SCSI_IRQ_NONE) if (instance->irq != SCSI_IRQ_NONE)
if (request_irq(instance->irq, NCR5380_intr, IRQ_FLG_SLOW, if (request_irq(instance->irq, NCR5380_intr, IRQ_FLG_SLOW,
"ncr5380", instance)) { "ncr5380", instance)) {
printk(KERN_WARNING "scsi%d: IRQ%d not free, interrupts disabled\n", printk(KERN_WARNING "scsi%d: IRQ%d not free, interrupts disabled\n",
instance->host_no, instance->irq); instance->host_no, instance->irq);
instance->irq = SCSI_IRQ_NONE; instance->irq = SCSI_IRQ_NONE;
...@@ -326,7 +326,7 @@ int macscsi_detect(struct scsi_host_template * tpnt) ...@@ -326,7 +326,7 @@ int macscsi_detect(struct scsi_host_template * tpnt)
int macscsi_release (struct Scsi_Host *shpnt) int macscsi_release (struct Scsi_Host *shpnt)
{ {
if (shpnt->irq != SCSI_IRQ_NONE) if (shpnt->irq != SCSI_IRQ_NONE)
free_irq (shpnt->irq, NCR5380_intr); free_irq(shpnt->irq, shpnt);
NCR5380_exit(shpnt); NCR5380_exit(shpnt);
return 0; return 0;
......
...@@ -453,7 +453,8 @@ int __init pas16_detect(struct scsi_host_template * tpnt) ...@@ -453,7 +453,8 @@ int __init pas16_detect(struct scsi_host_template * tpnt)
instance->irq = NCR5380_probe_irq(instance, PAS16_IRQS); instance->irq = NCR5380_probe_irq(instance, PAS16_IRQS);
if (instance->irq != SCSI_IRQ_NONE) if (instance->irq != SCSI_IRQ_NONE)
if (request_irq(instance->irq, pas16_intr, IRQF_DISABLED, "pas16", instance)) { if (request_irq(instance->irq, pas16_intr, IRQF_DISABLED,
"pas16", instance)) {
printk("scsi%d : IRQ%d not free, interrupts disabled\n", printk("scsi%d : IRQ%d not free, interrupts disabled\n",
instance->host_no, instance->irq); instance->host_no, instance->irq);
instance->irq = SCSI_IRQ_NONE; instance->irq = SCSI_IRQ_NONE;
...@@ -604,7 +605,7 @@ static inline int NCR5380_pwrite (struct Scsi_Host *instance, unsigned char *src ...@@ -604,7 +605,7 @@ static inline int NCR5380_pwrite (struct Scsi_Host *instance, unsigned char *src
static int pas16_release(struct Scsi_Host *shost) static int pas16_release(struct Scsi_Host *shost)
{ {
if (shost->irq) if (shost->irq)
free_irq(shost->irq, NULL); free_irq(shost->irq, shost);
NCR5380_exit(shost); NCR5380_exit(shost);
if (shost->dma_channel != 0xff) if (shost->dma_channel != 0xff)
free_dma(shost->dma_channel); free_dma(shost->dma_channel);
......
This diff is collapsed.
...@@ -268,7 +268,7 @@ int sun3scsi_detect(struct scsi_host_template * tpnt) ...@@ -268,7 +268,7 @@ int sun3scsi_detect(struct scsi_host_template * tpnt)
((struct NCR5380_hostdata *)instance->hostdata)->ctrl = 0; ((struct NCR5380_hostdata *)instance->hostdata)->ctrl = 0;
if (request_irq(instance->irq, scsi_sun3_intr, if (request_irq(instance->irq, scsi_sun3_intr,
0, "Sun3SCSI-5380", NULL)) { 0, "Sun3SCSI-5380", instance)) {
#ifndef REAL_DMA #ifndef REAL_DMA
printk("scsi%d: IRQ%d not free, interrupts disabled\n", printk("scsi%d: IRQ%d not free, interrupts disabled\n",
instance->host_no, instance->irq); instance->host_no, instance->irq);
...@@ -310,7 +310,7 @@ int sun3scsi_detect(struct scsi_host_template * tpnt) ...@@ -310,7 +310,7 @@ int sun3scsi_detect(struct scsi_host_template * tpnt)
int sun3scsi_release (struct Scsi_Host *shpnt) int sun3scsi_release (struct Scsi_Host *shpnt)
{ {
if (shpnt->irq != SCSI_IRQ_NONE) if (shpnt->irq != SCSI_IRQ_NONE)
free_irq (shpnt->irq, NULL); free_irq(shpnt->irq, shpnt);
iounmap((void *)sun3_scsi_regp); iounmap((void *)sun3_scsi_regp);
......
...@@ -230,7 +230,7 @@ static int sun3scsi_detect(struct scsi_host_template * tpnt) ...@@ -230,7 +230,7 @@ static int sun3scsi_detect(struct scsi_host_template * tpnt)
((struct NCR5380_hostdata *)instance->hostdata)->ctrl = 0; ((struct NCR5380_hostdata *)instance->hostdata)->ctrl = 0;
if (request_irq(instance->irq, scsi_sun3_intr, if (request_irq(instance->irq, scsi_sun3_intr,
0, "Sun3SCSI-5380VME", NULL)) { 0, "Sun3SCSI-5380VME", instance)) {
#ifndef REAL_DMA #ifndef REAL_DMA
printk("scsi%d: IRQ%d not free, interrupts disabled\n", printk("scsi%d: IRQ%d not free, interrupts disabled\n",
instance->host_no, instance->irq); instance->host_no, instance->irq);
...@@ -279,7 +279,7 @@ static int sun3scsi_detect(struct scsi_host_template * tpnt) ...@@ -279,7 +279,7 @@ static int sun3scsi_detect(struct scsi_host_template * tpnt)
int sun3scsi_release (struct Scsi_Host *shpnt) int sun3scsi_release (struct Scsi_Host *shpnt)
{ {
if (shpnt->irq != SCSI_IRQ_NONE) if (shpnt->irq != SCSI_IRQ_NONE)
free_irq (shpnt->irq, NULL); free_irq(shpnt->irq, shpnt);
iounmap((void *)sun3_scsi_regp); iounmap((void *)sun3_scsi_regp);
......
...@@ -259,7 +259,8 @@ found: ...@@ -259,7 +259,8 @@ found:
instance->irq = NCR5380_probe_irq(instance, T128_IRQS); instance->irq = NCR5380_probe_irq(instance, T128_IRQS);
if (instance->irq != SCSI_IRQ_NONE) if (instance->irq != SCSI_IRQ_NONE)
if (request_irq(instance->irq, t128_intr, IRQF_DISABLED, "t128", instance)) { if (request_irq(instance->irq, t128_intr, IRQF_DISABLED, "t128",
instance)) {
printk("scsi%d : IRQ%d not free, interrupts disabled\n", printk("scsi%d : IRQ%d not free, interrupts disabled\n",
instance->host_no, instance->irq); instance->host_no, instance->irq);
instance->irq = SCSI_IRQ_NONE; instance->irq = SCSI_IRQ_NONE;
...@@ -295,7 +296,7 @@ static int t128_release(struct Scsi_Host *shost) ...@@ -295,7 +296,7 @@ static int t128_release(struct Scsi_Host *shost)
NCR5380_local_declare(); NCR5380_local_declare();
NCR5380_setup(shost); NCR5380_setup(shost);
if (shost->irq) if (shost->irq)
free_irq(shost->irq, NULL); free_irq(shost->irq, shost);
NCR5380_exit(shost); NCR5380_exit(shost);
if (shost->io_port && shost->n_io_port) if (shost->io_port && shost->n_io_port)
release_region(shost->io_port, shost->n_io_port); release_region(shost->io_port, shost->n_io_port);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment