* [PATCH] some tmscsim consolidation
@ 2004-06-06 12:41 Christoph Hellwig
2004-06-06 20:22 ` Guennadi Liakhovetski
2004-06-23 15:59 ` Christoph Hellwig
0 siblings, 2 replies; 8+ messages in thread
From: Christoph Hellwig @ 2004-06-06 12:41 UTC (permalink / raw)
To: Guennadi Liakhovetski; +Cc: linux-scsi
I've looked through my old tmscsim patch queue and found this one:
- merge dc390_initDCB into dc390_slave_alloc
- merge DC390_release and dc390_shutdown into dc390_remove_one,
use del_timer_sync to make sure the timer is really deleted on
removal, adjust locking accordingly
- some tiny related cleanups
--- 1.38/drivers/scsi/tmscsim.c 2004-05-12 17:46:23 +02:00
+++ edited/drivers/scsi/tmscsim.c 2004-06-06 14:22:25 +02:00
@@ -340,11 +340,8 @@
static irqreturn_t do_DC390_Interrupt( int, void *, struct pt_regs *);
static int dc390_initAdapter( PSH psh, ULONG io_port, UCHAR Irq, UCHAR index );
-static void dc390_initDCB( PACB pACB, PDCB *ppDCB, UCHAR id, UCHAR lun);
static void dc390_updateDCB (PACB pACB, PDCB pDCB);
-static int DC390_release(struct Scsi_Host *host);
-static int dc390_shutdown (struct Scsi_Host *host);
static int DC390_proc_info (struct Scsi_Host *shpnt, char *buffer, char **start,
off_t offset, int length, int inout);
@@ -1527,94 +1524,6 @@
#include "scsiiom.c"
-
-/***********************************************************************
- * Function : static void dc390_initDCB()
- *
- * Purpose : initialize the internal structures for a DCB (to be malloced)
- *
- * Inputs : SCSI id and lun
- ***********************************************************************/
-
-static void dc390_initDCB( PACB pACB, PDCB *ppDCB, UCHAR id, UCHAR lun )
-{
- PEEprom prom;
- UCHAR index;
- PDCB pDCB, pDCB2;
-
- pDCB = kmalloc (sizeof(DC390_DCB), GFP_ATOMIC);
- DCBDEBUG(printk (KERN_INFO "DC390: alloc mem for DCB (ID %i, LUN %i): %p\n", \
- id, lun, pDCB));
-
- *ppDCB = pDCB;
- if (!pDCB) return;
- pDCB2 = 0;
- if( pACB->DCBCnt == 0 )
- {
- pACB->pLinkDCB = pDCB;
- pACB->pDCBRunRobin = pDCB;
- }
- else
- {
- pACB->pLastDCB->pNextDCB = pDCB;
- }
-
- pACB->DCBCnt++;
-
- pDCB->pNextDCB = pACB->pLinkDCB;
- pACB->pLastDCB = pDCB;
-
- pDCB->pDCBACB = pACB;
- pDCB->TargetID = id;
- pDCB->TargetLUN = lun;
- pDCB->pWaitingSRB = NULL;
- pDCB->pGoingSRB = NULL;
- pDCB->GoingSRBCnt = 0;
- pDCB->WaitSRBCnt = 0;
- pDCB->pActiveSRB = NULL;
- pDCB->TagMask = 0;
- pDCB->MaxCommand = 1;
- index = pACB->AdapterIndex;
- pDCB->DCBFlag = 0;
-
- /* Is there a corresp. LUN==0 device ? */
- if (lun != 0)
- pDCB2 = dc390_findDCB (pACB, id, 0);
- prom = (PEEprom) &dc390_eepromBuf[index][id << 2];
- /* Some values are for all LUNs: Copy them */
- /* In a clean way: We would have an own structure for a SCSI-ID */
- if (pDCB2)
- {
- pDCB->DevMode = pDCB2->DevMode;
- pDCB->SyncMode = pDCB2->SyncMode;
- pDCB->SyncPeriod = pDCB2->SyncPeriod;
- pDCB->SyncOffset = pDCB2->SyncOffset;
- pDCB->NegoPeriod = pDCB2->NegoPeriod;
-
- pDCB->CtrlR3 = pDCB2->CtrlR3;
- pDCB->CtrlR4 = pDCB2->CtrlR4;
- pDCB->Inquiry7 = pDCB2->Inquiry7;
- }
- else
- {
- pDCB->DevMode = prom->EE_MODE1;
- pDCB->SyncMode = 0;
- pDCB->SyncPeriod = 0;
- pDCB->SyncOffset = 0;
- pDCB->NegoPeriod = (dc390_clock_period1[prom->EE_SPEED] * 25) >> 2;
-
- pDCB->CtrlR3 = FAST_CLK;
-
- pDCB->CtrlR4 = pACB->glitch_cfg | CTRL4_RESERVED;
- if( dc390_eepromBuf[index][EE_MODE2] & ACTIVE_NEGATION)
- pDCB->CtrlR4 |= NEGATE_REQACKDATA | NEGATE_REQACK;
- pDCB->Inquiry7 = 0;
- }
-
- pACB->DCBmap[id] |= (1 << lun);
- dc390_updateDCB(pACB, pDCB);
-}
-
/***********************************************************************
* Function : static void dc390_updateDCB()
*
@@ -1900,34 +1809,84 @@
*
* @scsi_device: The new scsi device that we need to handle.
*/
-static int dc390_slave_alloc(struct scsi_device *scsi_device)
+static int dc390_slave_alloc(struct scsi_device *sdev)
{
- PDCB pDCB;
- PACB pACB = (PACB) scsi_device->host->hostdata;
- dc390_initDCB(pACB, &pDCB, scsi_device->id, scsi_device->lun);
- if (pDCB != NULL) {
- scsi_device->hostdata = pDCB;
- pACB->scan_devices = 1;
- return 0;
+ PACB pACB = (PACB) sdev->host->hostdata;
+ PDCB pDCB, pDCB2 = NULL;
+ uint id = sdev->id;
+ uint lun = sdev->lun;
+
+ pDCB = kmalloc(sizeof(DC390_DCB), GFP_KERNEL);
+ if (!pDCB)
+ return -ENOMEM;
+ memset(pDCB, 0, sizeof(*pDCB));
+
+ if (!pACB->DCBCnt++) {
+ pACB->pLinkDCB = pDCB;
+ pACB->pDCBRunRobin = pDCB;
+ } else {
+ pACB->pLastDCB->pNextDCB = pDCB;
+ }
+
+ pDCB->pNextDCB = pACB->pLinkDCB;
+ pACB->pLastDCB = pDCB;
+
+ pDCB->pDCBACB = pACB;
+ pDCB->TargetID = id;
+ pDCB->TargetLUN = lun;
+ pDCB->MaxCommand = 1;
+
+ /*
+ * Some values are for all LUNs: Copy them
+ * In a clean way: We would have an own structure for a SCSI-ID
+ */
+ if (lun && (pDCB2 = dc390_findDCB(pACB, id, 0))) {
+ pDCB->DevMode = pDCB2->DevMode;
+ pDCB->SyncMode = pDCB2->SyncMode;
+ pDCB->SyncPeriod = pDCB2->SyncPeriod;
+ pDCB->SyncOffset = pDCB2->SyncOffset;
+ pDCB->NegoPeriod = pDCB2->NegoPeriod;
+
+ pDCB->CtrlR3 = pDCB2->CtrlR3;
+ pDCB->CtrlR4 = pDCB2->CtrlR4;
+ pDCB->Inquiry7 = pDCB2->Inquiry7;
+ } else {
+ u8 index = pACB->AdapterIndex;
+ PEEprom prom = (PEEprom) &dc390_eepromBuf[index][id << 2];
+
+ pDCB->DevMode = prom->EE_MODE1;
+ pDCB->NegoPeriod =
+ (dc390_clock_period1[prom->EE_SPEED] * 25) >> 2;
+
+ pDCB->CtrlR3 = FAST_CLK;
+ pDCB->CtrlR4 = pACB->glitch_cfg | CTRL4_RESERVED;
+
+ if (dc390_eepromBuf[index][EE_MODE2] & ACTIVE_NEGATION)
+ pDCB->CtrlR4 |= NEGATE_REQACKDATA | NEGATE_REQACK;
}
- return -ENOMEM;
+
+ pACB->DCBmap[id] |= (1 << lun);
+ dc390_updateDCB(pACB, pDCB);
+
+ pACB->scan_devices = 1;
+
+ sdev->hostdata = pDCB;
+ return 0;
}
/**
* dc390_slave_destroy - Called by the scsi mid layer to tell us about a
* device that is going away.
*
- * @scsi_device: The scsi device that we need to remove.
+ * @sdev: The scsi device that we need to remove.
*/
-static void dc390_slave_destroy(struct scsi_device *scsi_device)
+static void dc390_slave_destroy(struct scsi_device *sdev)
{
- PACB pACB = (PACB) scsi_device->host->hostdata;
- PDCB pDCB = (PDCB) scsi_device->hostdata;
+ PACB pACB = (PACB) sdev->host->hostdata;
+ PDCB pDCB = (PDCB) sdev->hostdata;
+
pACB->scan_devices = 0;
- if (pDCB != NULL)
- dc390_remove_dev(pACB, pDCB);
- else
- printk(KERN_ERR"%s() called for non-existing device!\n", __FUNCTION__);
+ dc390_remove_dev(pACB, pDCB);
}
static int dc390_slave_configure(struct scsi_device *scsi_device)
@@ -2010,15 +1969,32 @@
*
* @dev: The PCI device to remove.
*/
-static void __devexit dc390_remove_one(struct pci_dev *dev)
+static void __devexit dc390_remove_one(struct pci_dev *pdev)
{
- struct Scsi_Host *scsi_host = pci_get_drvdata(dev);
+ struct Scsi_Host *shost = pci_get_drvdata(pdev);
+ PACB pACB = (PACB) shost->hostdata;
+ u8 bval;
+ DC390_IFLAGS;
- scsi_remove_host(scsi_host);
- DC390_release(scsi_host);
- pci_disable_device(dev);
- scsi_host_put(scsi_host);
- pci_set_drvdata(dev, NULL);
+ scsi_remove_host(shost);
+
+ DC390_LOCK_IO(shost);
+ pACB->ACBFlag = RESET_DEV;
+ bval = DC390_read8(CtrlReg1) | DIS_INT_ON_SCSI_RST;
+ DC390_write8(CtrlReg1, bval); /* disable interrupt */
+ if (pACB->Gmode2 & RST_SCSI_BUS)
+ dc390_ResetSCSIBus(pACB);
+ DC390_UNLOCK_IO(shost);
+
+ del_timer_sync(&pACB->Waiting_Timer);
+
+ free_irq(pdev->irq, pACB);
+ release_region(shost->io_port, shost->n_io_port);
+
+ scsi_host_put(shost);
+
+ pci_disable_device(pdev);
+ pci_set_drvdata(pdev, NULL);
}
/********************************************************************
@@ -2166,75 +2142,6 @@
#undef YESNO
#undef SPRINTF
-
-/***********************************************************************
- * Function : static int dc390_shutdown (struct Scsi_Host *host)
- *
- * Purpose : does a clean (we hope) shutdown of the SCSI chip.
- * Use prior to dumping core, unloading the driver, etc.
- *
- * Returns : 0 on success
- ***********************************************************************/
-static int dc390_shutdown (struct Scsi_Host *host)
-{
- UCHAR bval;
- PACB pACB = (PACB) host->hostdata;
-
-/* pACB->soft_reset(host); */
-
- printk(KERN_INFO "DC390: shutdown\n");
-
- pACB->ACBFlag = RESET_DEV;
- bval = DC390_read8 (CtrlReg1);
- bval |= DIS_INT_ON_SCSI_RST;
- DC390_write8 (CtrlReg1, bval); /* disable interrupt */
- if (pACB->Gmode2 & RST_SCSI_BUS)
- dc390_ResetSCSIBus (pACB);
-
- if (timer_pending (&pACB->Waiting_Timer)) del_timer (&pACB->Waiting_Timer);
- return( 0 );
-}
-
-static void dc390_freeDCBs (struct Scsi_Host *host)
-{
- PDCB pDCB, nDCB;
- PACB pACB = (PACB) host->hostdata;
-
- pDCB = pACB->pLinkDCB;
- if (!pDCB) return;
- do
- {
- nDCB = pDCB->pNextDCB;
- DCBDEBUG(printk (KERN_INFO "DC390: Free DCB (ID %i, LUN %i): %p\n",\
- pDCB->TargetID, pDCB->TargetLUN, pDCB));
- //kfree (pDCB);
- dc390_remove_dev (pACB, pDCB);
- pDCB = nDCB;
- } while (pDCB && pACB->pLinkDCB);
-
-}
-
-static int DC390_release (struct Scsi_Host *host)
-{
- DC390_IFLAGS;
- PACB pACB = (PACB) host->hostdata;
-
- DC390_LOCK_IO(host);
-
- /* TO DO: We should check for outstanding commands first. */
- dc390_shutdown (host);
-
- if (host->irq != SCSI_IRQ_NONE)
- {
- DEBUG0(printk(KERN_INFO "DC390: Free IRQ %i\n",host->irq));
- free_irq (host->irq, pACB);
- }
-
- release_region(host->io_port,host->n_io_port);
- dc390_freeDCBs (host);
- DC390_UNLOCK_IO(host);
- return( 1 );
-}
static struct pci_driver dc390_driver = {
.name = "tmscsim",
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] some tmscsim consolidation
2004-06-06 12:41 [PATCH] some tmscsim consolidation Christoph Hellwig
@ 2004-06-06 20:22 ` Guennadi Liakhovetski
2004-06-06 20:33 ` Christoph Hellwig
2004-06-23 15:59 ` Christoph Hellwig
1 sibling, 1 reply; 8+ messages in thread
From: Guennadi Liakhovetski @ 2004-06-06 20:22 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: linux-scsi
On Sun, 6 Jun 2004, Christoph Hellwig wrote:
> I've looked through my old tmscsim patch queue and found this one:
>
> - merge dc390_initDCB into dc390_slave_alloc
> - merge DC390_release and dc390_shutdown into dc390_remove_one,
> use del_timer_sync to make sure the timer is really deleted on
> removal, adjust locking accordingly
> - some tiny related cleanups
Thanks for the patch, Christoph. As you might have seen, I've already
submitted a patch, which merges _some_ of the functions above, following
your request:-). Is your patch based on something like vanilla 2.6.6, or
some bkX / preY? I'll try to find a version, to which it cleanly applies
and then re-diff with the current state.
Since you didn't sing-off for the patch, I guess, it's not yet
compulsory:-)
Thanks
Guennadi
---
Guennadi Liakhovetski
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] some tmscsim consolidation
2004-06-06 20:22 ` Guennadi Liakhovetski
@ 2004-06-06 20:33 ` Christoph Hellwig
2004-06-07 20:37 ` Guennadi Liakhovetski
0 siblings, 1 reply; 8+ messages in thread
From: Christoph Hellwig @ 2004-06-06 20:33 UTC (permalink / raw)
To: Guennadi Liakhovetski; +Cc: linux-scsi
On Sun, Jun 06, 2004 at 10:22:41PM +0200, Guennadi Liakhovetski wrote:
> On Sun, 6 Jun 2004, Christoph Hellwig wrote:
>
> > I've looked through my old tmscsim patch queue and found this one:
> >
> > - merge dc390_initDCB into dc390_slave_alloc
> > - merge DC390_release and dc390_shutdown into dc390_remove_one,
> > use del_timer_sync to make sure the timer is really deleted on
> > removal, adjust locking accordingly
> > - some tiny related cleanups
>
> Thanks for the patch, Christoph. As you might have seen, I've already
> submitted a patch, which merges _some_ of the functions above, following
> your request:-). Is your patch based on something like vanilla 2.6.6, or
> some bkX / preY? I'll try to find a version, to which it cleanly applies
> and then re-diff with the current state.
Ah sorry. It's against James' scsi-misc-2.6 tree from a day or two ago.
I'll keep my eyes open and when I see your patch going in somewhere I'll
resend what's left if anything.
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] some tmscsim consolidation
2004-06-06 20:33 ` Christoph Hellwig
@ 2004-06-07 20:37 ` Guennadi Liakhovetski
2004-06-20 16:21 ` Christoph Hellwig
0 siblings, 1 reply; 8+ messages in thread
From: Guennadi Liakhovetski @ 2004-06-07 20:37 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: linux-scsi
On Sun, 6 Jun 2004, Christoph Hellwig wrote:
> On Sun, Jun 06, 2004 at 10:22:41PM +0200, Guennadi Liakhovetski wrote:
> > On Sun, 6 Jun 2004, Christoph Hellwig wrote:
> >
> > > I've looked through my old tmscsim patch queue and found this one:
> > >
> > > - merge dc390_initDCB into dc390_slave_alloc
> > > - merge DC390_release and dc390_shutdown into dc390_remove_one,
> > > use del_timer_sync to make sure the timer is really deleted on
> > > removal, adjust locking accordingly
> > > - some tiny related cleanups
> >
> > Thanks for the patch, Christoph. As you might have seen, I've already
> > submitted a patch, which merges _some_ of the functions above, following
>
> Ah sorry. It's against James' scsi-misc-2.6 tree from a day or two ago.
> I'll keep my eyes open and when I see your patch going in somewhere I'll
> resend what's left if anything.
Thanks again! That would, certainly, be a lot easier for me. But don't
worry - there'll be enough left for you:-) I think, the only thing I've
done from the above, is merging dc390_initDCB into dc390_slave_alloc and
DC390_release into dc390_remove_one, following your suggestion of 23 May.
Thanks
Guennadi
---
Guennadi Liakhovetski
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] some tmscsim consolidation
2004-06-07 20:37 ` Guennadi Liakhovetski
@ 2004-06-20 16:21 ` Christoph Hellwig
2004-06-20 20:26 ` Guennadi Liakhovetski
0 siblings, 1 reply; 8+ messages in thread
From: Christoph Hellwig @ 2004-06-20 16:21 UTC (permalink / raw)
To: Guennadi Liakhovetski; +Cc: linux-scsi
On Mon, Jun 07, 2004 at 10:37:24PM +0200, Guennadi Liakhovetski wrote:
> On Sun, 6 Jun 2004, Christoph Hellwig wrote:
>
> > On Sun, Jun 06, 2004 at 10:22:41PM +0200, Guennadi Liakhovetski wrote:
> > > On Sun, 6 Jun 2004, Christoph Hellwig wrote:
> > >
> > > > I've looked through my old tmscsim patch queue and found this one:
> > > >
> > > > - merge dc390_initDCB into dc390_slave_alloc
> > > > - merge DC390_release and dc390_shutdown into dc390_remove_one,
> > > > use del_timer_sync to make sure the timer is really deleted on
> > > > removal, adjust locking accordingly
> > > > - some tiny related cleanups
> > >
> > > Thanks for the patch, Christoph. As you might have seen, I've already
> > > submitted a patch, which merges _some_ of the functions above, following
> >
> > Ah sorry. It's against James' scsi-misc-2.6 tree from a day or two ago.
> > I'll keep my eyes open and when I see your patch going in somewhere I'll
> > resend what's left if anything.
>
> Thanks again! That would, certainly, be a lot easier for me. But don't
> worry - there'll be enough left for you:-) I think, the only thing I've
> done from the above, is merging dc390_initDCB into dc390_slave_alloc and
> DC390_release into dc390_remove_one, following your suggestion of 23 May.
Your patch doesn't seem to be merged yet. Maybe you need to resend it?
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] some tmscsim consolidation
2004-06-20 16:21 ` Christoph Hellwig
@ 2004-06-20 20:26 ` Guennadi Liakhovetski
0 siblings, 0 replies; 8+ messages in thread
From: Guennadi Liakhovetski @ 2004-06-20 20:26 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: linux-scsi
On Sun, 20 Jun 2004, Christoph Hellwig wrote:
> On Mon, Jun 07, 2004 at 10:37:24PM +0200, Guennadi Liakhovetski wrote:
>> On Sun, 6 Jun 2004, Christoph Hellwig wrote:
>>
>>> On Sun, Jun 06, 2004 at 10:22:41PM +0200, Guennadi Liakhovetski wrote:
>>>> On Sun, 6 Jun 2004, Christoph Hellwig wrote:
>>>>
>>>>> I've looked through my old tmscsim patch queue and found this one:
>>>>>
>>>>> - merge dc390_initDCB into dc390_slave_alloc
>>>>> - merge DC390_release and dc390_shutdown into dc390_remove_one,
>>>>> use del_timer_sync to make sure the timer is really deleted on
>>>>> removal, adjust locking accordingly
>>>>> - some tiny related cleanups
>>>>
>>>> Thanks for the patch, Christoph. As you might have seen, I've already
>>>> submitted a patch, which merges _some_ of the functions above, following
>>>
>>> Ah sorry. It's against James' scsi-misc-2.6 tree from a day or two ago.
>>> I'll keep my eyes open and when I see your patch going in somewhere I'll
>>> resend what's left if anything.
>>
>> Thanks again! That would, certainly, be a lot easier for me. But don't
>> worry - there'll be enough left for you:-) I think, the only thing I've
>> done from the above, is merging dc390_initDCB into dc390_slave_alloc and
>> DC390_release into dc390_remove_one, following your suggestion of 23 May.
>
> Your patch doesn't seem to be merged yet. Maybe you need to resend it?
Please, see my other email, sent simultaneously with this one.
Thanks
Guennadi
---
Guennadi Liakhovetski
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] some tmscsim consolidation
2004-06-06 12:41 [PATCH] some tmscsim consolidation Christoph Hellwig
2004-06-06 20:22 ` Guennadi Liakhovetski
@ 2004-06-23 15:59 ` Christoph Hellwig
2004-06-23 22:16 ` Guennadi Liakhovetski
1 sibling, 1 reply; 8+ messages in thread
From: Christoph Hellwig @ 2004-06-23 15:59 UTC (permalink / raw)
To: Guennadi Liakhovetski; +Cc: linux-scsi
On Sun, Jun 06, 2004 at 02:41:56PM +0200, Christoph Hellwig wrote:
> I've looked through my old tmscsim patch queue and found this one:
>
> - merge dc390_initDCB into dc390_slave_alloc
> - merge DC390_release and dc390_shutdown into dc390_remove_one,
> use del_timer_sync to make sure the timer is really deleted on
> removal, adjust locking accordingly
> - some tiny related cleanups
Okay, here's a resend vs current scsi-misc-2.6 that has your three
outstanding merged. Additionally I've also killed dc390_freeDCBs()
as all dcbs are removed in ->slave_destroy.
--- 1.14/drivers/scsi/scsiiom.c 2004-06-19 01:03:38 +02:00
+++ edited/drivers/scsi/scsiiom.c 2004-06-23 16:40:08 +02:00
@@ -1283,46 +1283,6 @@
DC390_write8 (ScsiCmd, MSG_ACCEPTED_CMD); /* ;to release the /ACK signal */
}
-
-static void
-dc390_remove_dev (PACB pACB, PDCB pDCB)
-{
- PDCB pPrevDCB = pACB->pLinkDCB;
-
- if (pDCB->GoingSRBCnt > 1)
- {
- DCBDEBUG(printk (KERN_INFO "DC390: Driver won't free DCB (ID %i, LUN %i): 0x%08x because of SRBCnt %i\n",\
- pDCB->TargetID, pDCB->TargetLUN, (int)pDCB, pDCB->GoingSRBCnt));
- return;
- }
- pACB->DCBmap[pDCB->TargetID] &= ~(1 << pDCB->TargetLUN);
-
- // The first one
- if (pDCB == pACB->pLinkDCB)
- {
- // The last one
- if (pACB->pLastDCB == pDCB) {
- pDCB->pNextDCB = 0; pACB->pLastDCB = 0;
- }
- pACB->pLinkDCB = pDCB->pNextDCB;
- }
- else
- {
- while (pPrevDCB->pNextDCB != pDCB) pPrevDCB = pPrevDCB->pNextDCB;
- pPrevDCB->pNextDCB = pDCB->pNextDCB;
- if (pDCB == pACB->pLastDCB) pACB->pLastDCB = pPrevDCB;
- }
-
- DCBDEBUG(printk (KERN_INFO "DC390: Driver about to free DCB (ID %i, LUN %i): %p\n",\
- pDCB->TargetID, pDCB->TargetLUN, pDCB));
- if (pDCB == pACB->pActiveDCB) pACB->pActiveDCB = 0;
- if (pDCB == pACB->pLinkDCB) pACB->pLinkDCB = pDCB->pNextDCB;
- if (pDCB == pACB->pDCBRunRobin) pACB->pDCBRunRobin = pDCB->pNextDCB;
- kfree (pDCB);
- pACB->DCBCnt--;
-}
-
-
static UCHAR __inline__
dc390_tagq_blacklist (char* name)
{
--- 1.41/drivers/scsi/tmscsim.c 2004-06-19 01:02:20 +02:00
+++ edited/drivers/scsi/tmscsim.c 2004-06-23 17:48:00 +02:00
@@ -326,11 +326,9 @@
static void __inline__ dc390_RequestSense( PACB pACB, PDCB pDCB, PSRB pSRB );
static void __inline__ dc390_InvalidCmd( PACB pACB );
static void __inline__ dc390_EnableMsgOut_Abort (PACB, PSRB);
-static void dc390_remove_dev (PACB pACB, PDCB pDCB);
static irqreturn_t do_DC390_Interrupt( int, void *, struct pt_regs *);
static int dc390_initAdapter( PSH psh, ULONG io_port, UCHAR Irq, UCHAR index );
-static void dc390_initDCB( PACB pACB, PDCB *ppDCB, UCHAR id, UCHAR lun);
static void dc390_updateDCB (PACB pACB, PDCB pDCB);
static int DC390_proc_info (struct Scsi_Host *shpnt, char *buffer, char **start,
@@ -1522,95 +1520,6 @@
#include "scsiiom.c"
-
-/***********************************************************************
- * Function : static void dc390_initDCB()
- *
- * Purpose : initialize the internal structures for a DCB (to be malloced)
- *
- * Inputs : SCSI id and lun
- ***********************************************************************/
-
-static void dc390_initDCB( PACB pACB, PDCB *ppDCB, UCHAR id, UCHAR lun )
-{
- PEEprom prom;
- UCHAR index;
- PDCB pDCB, pDCB2 = 0;
-
- pDCB = kmalloc (sizeof(DC390_DCB), GFP_ATOMIC);
- DCBDEBUG(printk (KERN_INFO "DC390: alloc mem for DCB (ID %i, LUN %i): %p\n", \
- id, lun, pDCB));
-
- *ppDCB = pDCB;
- if (!pDCB)
- return;
-
- if( pACB->DCBCnt == 0 )
- {
- pACB->pLinkDCB = pDCB;
- pACB->pDCBRunRobin = pDCB;
- }
- else
- {
- pACB->pLastDCB->pNextDCB = pDCB;
- }
-
- pACB->DCBCnt++;
-
- pDCB->pNextDCB = pACB->pLinkDCB;
- pACB->pLastDCB = pDCB;
-
- pDCB->pDCBACB = pACB;
- pDCB->TargetID = id;
- pDCB->TargetLUN = lun;
- pDCB->pWaitingSRB = NULL;
- pDCB->pGoingSRB = NULL;
- pDCB->GoingSRBCnt = 0;
- pDCB->WaitSRBCnt = 0;
- pDCB->pActiveSRB = NULL;
- pDCB->TagMask = 0;
- pDCB->MaxCommand = 1;
- index = pACB->AdapterIndex;
- pDCB->DCBFlag = 0;
-
- /* Is there a corresp. LUN==0 device ? */
- if (lun != 0)
- pDCB2 = dc390_findDCB (pACB, id, 0);
- prom = (PEEprom) &dc390_eepromBuf[index][id << 2];
- /* Some values are for all LUNs: Copy them */
- /* In a clean way: We would have an own structure for a SCSI-ID */
- if (pDCB2)
- {
- pDCB->DevMode = pDCB2->DevMode;
- pDCB->SyncMode = pDCB2->SyncMode;
- pDCB->SyncPeriod = pDCB2->SyncPeriod;
- pDCB->SyncOffset = pDCB2->SyncOffset;
- pDCB->NegoPeriod = pDCB2->NegoPeriod;
-
- pDCB->CtrlR3 = pDCB2->CtrlR3;
- pDCB->CtrlR4 = pDCB2->CtrlR4;
- pDCB->Inquiry7 = pDCB2->Inquiry7;
- }
- else
- {
- pDCB->DevMode = prom->EE_MODE1;
- pDCB->SyncMode = 0;
- pDCB->SyncPeriod = 0;
- pDCB->SyncOffset = 0;
- pDCB->NegoPeriod = (dc390_clock_period1[prom->EE_SPEED] * 25) >> 2;
-
- pDCB->CtrlR3 = FAST_CLK;
-
- pDCB->CtrlR4 = pACB->glitch_cfg | CTRL4_RESERVED;
- if( dc390_eepromBuf[index][EE_MODE2] & ACTIVE_NEGATION)
- pDCB->CtrlR4 |= NEGATE_REQACKDATA | NEGATE_REQACK;
- pDCB->Inquiry7 = 0;
- }
-
- pACB->DCBmap[id] |= (1 << lun);
- dc390_updateDCB(pACB, pDCB);
-}
-
/***********************************************************************
* Function : static void dc390_updateDCB()
*
@@ -1839,15 +1748,64 @@
*/
static int dc390_slave_alloc(struct scsi_device *scsi_device)
{
- PDCB pDCB;
PACB pACB = (PACB) scsi_device->host->hostdata;
- dc390_initDCB(pACB, &pDCB, scsi_device->id, scsi_device->lun);
- if (pDCB != NULL) {
- scsi_device->hostdata = pDCB;
- pACB->scan_devices = 1;
- return 0;
+ PDCB pDCB, pDCB2 = 0;
+ uint id = scsi_device->id;
+ uint lun = scsi_device->lun;
+
+ pDCB = kmalloc(sizeof(DC390_DCB), GFP_KERNEL);
+ if (!pDCB)
+ return -ENOMEM;
+ memset(pDCB, 0, sizeof(DC390_DCB));
+
+ if (!pACB->DCBCnt++) {
+ pACB->pLinkDCB = pDCB;
+ pACB->pDCBRunRobin = pDCB;
+ } else {
+ pACB->pLastDCB->pNextDCB = pDCB;
+ }
+
+ pDCB->pNextDCB = pACB->pLinkDCB;
+ pACB->pLastDCB = pDCB;
+
+ pDCB->pDCBACB = pACB;
+ pDCB->TargetID = id;
+ pDCB->TargetLUN = lun;
+ pDCB->MaxCommand = 1;
+
+ /*
+ * Some values are for all LUNs: Copy them
+ * In a clean way: We would have an own structure for a SCSI-ID
+ */
+ if (lun && (pDCB2 = dc390_findDCB(pACB, id, 0))) {
+ pDCB->DevMode = pDCB2->DevMode;
+ pDCB->SyncMode = pDCB2->SyncMode;
+ pDCB->SyncPeriod = pDCB2->SyncPeriod;
+ pDCB->SyncOffset = pDCB2->SyncOffset;
+ pDCB->NegoPeriod = pDCB2->NegoPeriod;
+
+ pDCB->CtrlR3 = pDCB2->CtrlR3;
+ pDCB->CtrlR4 = pDCB2->CtrlR4;
+ pDCB->Inquiry7 = pDCB2->Inquiry7;
+ } else {
+ u8 index = pACB->AdapterIndex;
+ PEEprom prom = (PEEprom) &dc390_eepromBuf[index][id << 2];
+
+ pDCB->DevMode = prom->EE_MODE1;
+ pDCB->NegoPeriod =
+ (dc390_clock_period1[prom->EE_SPEED] * 25) >> 2;
+ pDCB->CtrlR3 = FAST_CLK;
+ pDCB->CtrlR4 = pACB->glitch_cfg | CTRL4_RESERVED;
+ if (dc390_eepromBuf[index][EE_MODE2] & ACTIVE_NEGATION)
+ pDCB->CtrlR4 |= NEGATE_REQACKDATA | NEGATE_REQACK;
}
- return -ENOMEM;
+
+ pACB->DCBmap[id] |= (1 << lun);
+ dc390_updateDCB(pACB, pDCB);
+
+ pACB->scan_devices = 1;
+ scsi_device->hostdata = pDCB;
+ return 0;
}
/**
@@ -1860,11 +1818,37 @@
{
PACB pACB = (PACB) scsi_device->host->hostdata;
PDCB pDCB = (PDCB) scsi_device->hostdata;
+ PDCB pPrevDCB = pACB->pLinkDCB;
+
pACB->scan_devices = 0;
- if (pDCB != NULL)
- dc390_remove_dev(pACB, pDCB);
- else
- printk(KERN_ERR"%s() called for non-existing device!\n", __FUNCTION__);
+
+ BUG_ON(pDCB->GoingSRBCnt > 1);
+
+ pACB->DCBmap[pDCB->TargetID] &= ~(1 << pDCB->TargetLUN);
+
+ if (pDCB == pACB->pLinkDCB) {
+ if (pACB->pLastDCB == pDCB) {
+ pDCB->pNextDCB = NULL;
+ pACB->pLastDCB = NULL;
+ }
+ pACB->pLinkDCB = pDCB->pNextDCB;
+ } else {
+ while (pPrevDCB->pNextDCB != pDCB)
+ pPrevDCB = pPrevDCB->pNextDCB;
+ pPrevDCB->pNextDCB = pDCB->pNextDCB;
+ if (pDCB == pACB->pLastDCB)
+ pACB->pLastDCB = pPrevDCB;
+ }
+
+ if (pDCB == pACB->pActiveDCB)
+ pACB->pActiveDCB = NULL;
+ if (pDCB == pACB->pLinkDCB)
+ pACB->pLinkDCB = pDCB->pNextDCB;
+ if (pDCB == pACB->pDCBRunRobin)
+ pACB->pDCBRunRobin = pDCB->pNextDCB;
+ kfree(pDCB);
+
+ pACB->DCBCnt--;
}
static int dc390_slave_configure(struct scsi_device *scsi_device)
@@ -1966,52 +1950,6 @@
return ret;
}
-static void __devexit dc390_freeDCBs (struct Scsi_Host *host)
-{
- PDCB pDCB, nDCB;
- PACB pACB = (PACB) host->hostdata;
-
- pDCB = pACB->pLinkDCB;
- if (!pDCB) return;
- do
- {
- nDCB = pDCB->pNextDCB;
- DCBDEBUG(printk (KERN_INFO "DC390: Free DCB (ID %i, LUN %i): %p\n",\
- pDCB->TargetID, pDCB->TargetLUN, pDCB));
- //kfree (pDCB);
- dc390_remove_dev (pACB, pDCB);
- pDCB = nDCB;
- } while (pDCB && pACB->pLinkDCB);
-}
-
-/***********************************************************************
- * Function : static int dc390_shutdown (struct Scsi_Host *host)
- *
- * Purpose : does a clean (we hope) shutdown of the SCSI chip.
- * Use prior to dumping core, unloading the driver, etc.
- *
- * Returns : 0 on success
- ***********************************************************************/
-static int __devexit dc390_shutdown (struct Scsi_Host *host)
-{
- UCHAR bval;
- PACB pACB = (PACB) host->hostdata;
-
-/* pACB->soft_reset(host); */
-
- printk(KERN_INFO "DC390: shutdown\n");
-
- pACB->ACBFlag = RESET_DEV;
- bval = DC390_read8 (CtrlReg1);
- bval |= DIS_INT_ON_SCSI_RST;
- DC390_write8 (CtrlReg1, bval); /* disable interrupt */
- if (pACB->Gmode2 & RST_SCSI_BUS)
- dc390_ResetSCSIBus (pACB);
-
- if (timer_pending (&pACB->Waiting_Timer)) del_timer (&pACB->Waiting_Timer);
- return( 0 );
-}
-
/**
* dc390_remove_one - Called to remove a single instance of the adapter.
*
@@ -2022,22 +1960,22 @@
struct Scsi_Host *scsi_host = pci_get_drvdata(dev);
unsigned long iflags;
PACB pACB = (PACB) scsi_host->hostdata;
+ u8 bval;
scsi_remove_host(scsi_host);
spin_lock_irqsave(scsi_host->host_lock, iflags);
+ pACB->ACBFlag = RESET_DEV;
+ bval = DC390_read8(CtrlReg1) | DIS_INT_ON_SCSI_RST;
+ DC390_write8 (CtrlReg1, bval); /* disable interrupt */
+ if (pACB->Gmode2 & RST_SCSI_BUS)
+ dc390_ResetSCSIBus(pACB);
+ spin_unlock_irqrestore(scsi_host->host_lock, iflags);
- /* TO DO: We should check for outstanding commands first. */
- dc390_shutdown(scsi_host);
-
- if (scsi_host->irq != SCSI_IRQ_NONE) {
- DEBUG0(printk(KERN_INFO "DC390: Free IRQ %i\n", scsi_host->irq));
- free_irq(scsi_host->irq, pACB);
- }
+ del_timer_sync(&pACB->Waiting_Timer);
+ free_irq(scsi_host->irq, pACB);
release_region(scsi_host->io_port, scsi_host->n_io_port);
- dc390_freeDCBs(scsi_host);
- spin_unlock_irqrestore(scsi_host->host_lock, iflags);
pci_disable_device(dev);
scsi_host_put(scsi_host);
^ permalink raw reply [flat|nested] 8+ messages in thread
* Re: [PATCH] some tmscsim consolidation
2004-06-23 15:59 ` Christoph Hellwig
@ 2004-06-23 22:16 ` Guennadi Liakhovetski
0 siblings, 0 replies; 8+ messages in thread
From: Guennadi Liakhovetski @ 2004-06-23 22:16 UTC (permalink / raw)
To: Christoph Hellwig; +Cc: linux-scsi, James Bottomley
Hi
On Wed, 23 Jun 2004, Christoph Hellwig wrote:
> On Sun, Jun 06, 2004 at 02:41:56PM +0200, Christoph Hellwig wrote:
>> I've looked through my old tmscsim patch queue and found this one:
>>
>> - merge dc390_initDCB into dc390_slave_alloc
>> - merge DC390_release and dc390_shutdown into dc390_remove_one,
>> use del_timer_sync to make sure the timer is really deleted on
>> removal, adjust locking accordingly
>> - some tiny related cleanups
>
> Okay, here's a resend vs current scsi-misc-2.6 that has your three
> outstanding merged. Additionally I've also killed dc390_freeDCBs()
> as all dcbs are removed in ->slave_destroy.
Thanks, Christoph!
James, I need not to say - no objections, please, apply.
Thanks
Guennadi
>
>
> --- 1.14/drivers/scsi/scsiiom.c 2004-06-19 01:03:38 +02:00
> +++ edited/drivers/scsi/scsiiom.c 2004-06-23 16:40:08 +02:00
> @@ -1283,46 +1283,6 @@
> DC390_write8 (ScsiCmd, MSG_ACCEPTED_CMD); /* ;to release the /ACK signal */
> }
>
> -
> -static void
> -dc390_remove_dev (PACB pACB, PDCB pDCB)
> -{
> - PDCB pPrevDCB = pACB->pLinkDCB;
> -
> - if (pDCB->GoingSRBCnt > 1)
> - {
> - DCBDEBUG(printk (KERN_INFO "DC390: Driver won't free DCB (ID %i, LUN %i): 0x%08x because of SRBCnt %i\n",\
> - pDCB->TargetID, pDCB->TargetLUN, (int)pDCB, pDCB->GoingSRBCnt));
> - return;
> - }
> - pACB->DCBmap[pDCB->TargetID] &= ~(1 << pDCB->TargetLUN);
> -
> - // The first one
> - if (pDCB == pACB->pLinkDCB)
> - {
> - // The last one
> - if (pACB->pLastDCB == pDCB) {
> - pDCB->pNextDCB = 0; pACB->pLastDCB = 0;
> - }
> - pACB->pLinkDCB = pDCB->pNextDCB;
> - }
> - else
> - {
> - while (pPrevDCB->pNextDCB != pDCB) pPrevDCB = pPrevDCB->pNextDCB;
> - pPrevDCB->pNextDCB = pDCB->pNextDCB;
> - if (pDCB == pACB->pLastDCB) pACB->pLastDCB = pPrevDCB;
> - }
> -
> - DCBDEBUG(printk (KERN_INFO "DC390: Driver about to free DCB (ID %i, LUN %i): %p\n",\
> - pDCB->TargetID, pDCB->TargetLUN, pDCB));
> - if (pDCB == pACB->pActiveDCB) pACB->pActiveDCB = 0;
> - if (pDCB == pACB->pLinkDCB) pACB->pLinkDCB = pDCB->pNextDCB;
> - if (pDCB == pACB->pDCBRunRobin) pACB->pDCBRunRobin = pDCB->pNextDCB;
> - kfree (pDCB);
> - pACB->DCBCnt--;
> -}
> -
> -
> static UCHAR __inline__
> dc390_tagq_blacklist (char* name)
> {
> --- 1.41/drivers/scsi/tmscsim.c 2004-06-19 01:02:20 +02:00
> +++ edited/drivers/scsi/tmscsim.c 2004-06-23 17:48:00 +02:00
> @@ -326,11 +326,9 @@
> static void __inline__ dc390_RequestSense( PACB pACB, PDCB pDCB, PSRB pSRB );
> static void __inline__ dc390_InvalidCmd( PACB pACB );
> static void __inline__ dc390_EnableMsgOut_Abort (PACB, PSRB);
> -static void dc390_remove_dev (PACB pACB, PDCB pDCB);
> static irqreturn_t do_DC390_Interrupt( int, void *, struct pt_regs *);
>
> static int dc390_initAdapter( PSH psh, ULONG io_port, UCHAR Irq, UCHAR index );
> -static void dc390_initDCB( PACB pACB, PDCB *ppDCB, UCHAR id, UCHAR lun);
> static void dc390_updateDCB (PACB pACB, PDCB pDCB);
>
> static int DC390_proc_info (struct Scsi_Host *shpnt, char *buffer, char **start,
> @@ -1522,95 +1520,6 @@
>
> #include "scsiiom.c"
>
> -
> -/***********************************************************************
> - * Function : static void dc390_initDCB()
> - *
> - * Purpose : initialize the internal structures for a DCB (to be malloced)
> - *
> - * Inputs : SCSI id and lun
> - ***********************************************************************/
> -
> -static void dc390_initDCB( PACB pACB, PDCB *ppDCB, UCHAR id, UCHAR lun )
> -{
> - PEEprom prom;
> - UCHAR index;
> - PDCB pDCB, pDCB2 = 0;
> -
> - pDCB = kmalloc (sizeof(DC390_DCB), GFP_ATOMIC);
> - DCBDEBUG(printk (KERN_INFO "DC390: alloc mem for DCB (ID %i, LUN %i): %p\n", \
> - id, lun, pDCB));
> -
> - *ppDCB = pDCB;
> - if (!pDCB)
> - return;
> -
> - if( pACB->DCBCnt == 0 )
> - {
> - pACB->pLinkDCB = pDCB;
> - pACB->pDCBRunRobin = pDCB;
> - }
> - else
> - {
> - pACB->pLastDCB->pNextDCB = pDCB;
> - }
> -
> - pACB->DCBCnt++;
> -
> - pDCB->pNextDCB = pACB->pLinkDCB;
> - pACB->pLastDCB = pDCB;
> -
> - pDCB->pDCBACB = pACB;
> - pDCB->TargetID = id;
> - pDCB->TargetLUN = lun;
> - pDCB->pWaitingSRB = NULL;
> - pDCB->pGoingSRB = NULL;
> - pDCB->GoingSRBCnt = 0;
> - pDCB->WaitSRBCnt = 0;
> - pDCB->pActiveSRB = NULL;
> - pDCB->TagMask = 0;
> - pDCB->MaxCommand = 1;
> - index = pACB->AdapterIndex;
> - pDCB->DCBFlag = 0;
> -
> - /* Is there a corresp. LUN==0 device ? */
> - if (lun != 0)
> - pDCB2 = dc390_findDCB (pACB, id, 0);
> - prom = (PEEprom) &dc390_eepromBuf[index][id << 2];
> - /* Some values are for all LUNs: Copy them */
> - /* In a clean way: We would have an own structure for a SCSI-ID */
> - if (pDCB2)
> - {
> - pDCB->DevMode = pDCB2->DevMode;
> - pDCB->SyncMode = pDCB2->SyncMode;
> - pDCB->SyncPeriod = pDCB2->SyncPeriod;
> - pDCB->SyncOffset = pDCB2->SyncOffset;
> - pDCB->NegoPeriod = pDCB2->NegoPeriod;
> -
> - pDCB->CtrlR3 = pDCB2->CtrlR3;
> - pDCB->CtrlR4 = pDCB2->CtrlR4;
> - pDCB->Inquiry7 = pDCB2->Inquiry7;
> - }
> - else
> - {
> - pDCB->DevMode = prom->EE_MODE1;
> - pDCB->SyncMode = 0;
> - pDCB->SyncPeriod = 0;
> - pDCB->SyncOffset = 0;
> - pDCB->NegoPeriod = (dc390_clock_period1[prom->EE_SPEED] * 25) >> 2;
> -
> - pDCB->CtrlR3 = FAST_CLK;
> -
> - pDCB->CtrlR4 = pACB->glitch_cfg | CTRL4_RESERVED;
> - if( dc390_eepromBuf[index][EE_MODE2] & ACTIVE_NEGATION)
> - pDCB->CtrlR4 |= NEGATE_REQACKDATA | NEGATE_REQACK;
> - pDCB->Inquiry7 = 0;
> - }
> -
> - pACB->DCBmap[id] |= (1 << lun);
> - dc390_updateDCB(pACB, pDCB);
> -}
> -
> /***********************************************************************
> * Function : static void dc390_updateDCB()
> *
> @@ -1839,15 +1748,64 @@
> */
> static int dc390_slave_alloc(struct scsi_device *scsi_device)
> {
> - PDCB pDCB;
> PACB pACB = (PACB) scsi_device->host->hostdata;
> - dc390_initDCB(pACB, &pDCB, scsi_device->id, scsi_device->lun);
> - if (pDCB != NULL) {
> - scsi_device->hostdata = pDCB;
> - pACB->scan_devices = 1;
> - return 0;
> + PDCB pDCB, pDCB2 = 0;
> + uint id = scsi_device->id;
> + uint lun = scsi_device->lun;
> +
> + pDCB = kmalloc(sizeof(DC390_DCB), GFP_KERNEL);
> + if (!pDCB)
> + return -ENOMEM;
> + memset(pDCB, 0, sizeof(DC390_DCB));
> +
> + if (!pACB->DCBCnt++) {
> + pACB->pLinkDCB = pDCB;
> + pACB->pDCBRunRobin = pDCB;
> + } else {
> + pACB->pLastDCB->pNextDCB = pDCB;
> + }
> +
> + pDCB->pNextDCB = pACB->pLinkDCB;
> + pACB->pLastDCB = pDCB;
> +
> + pDCB->pDCBACB = pACB;
> + pDCB->TargetID = id;
> + pDCB->TargetLUN = lun;
> + pDCB->MaxCommand = 1;
> +
> + /*
> + * Some values are for all LUNs: Copy them
> + * In a clean way: We would have an own structure for a SCSI-ID
> + */
> + if (lun && (pDCB2 = dc390_findDCB(pACB, id, 0))) {
> + pDCB->DevMode = pDCB2->DevMode;
> + pDCB->SyncMode = pDCB2->SyncMode;
> + pDCB->SyncPeriod = pDCB2->SyncPeriod;
> + pDCB->SyncOffset = pDCB2->SyncOffset;
> + pDCB->NegoPeriod = pDCB2->NegoPeriod;
> +
> + pDCB->CtrlR3 = pDCB2->CtrlR3;
> + pDCB->CtrlR4 = pDCB2->CtrlR4;
> + pDCB->Inquiry7 = pDCB2->Inquiry7;
> + } else {
> + u8 index = pACB->AdapterIndex;
> + PEEprom prom = (PEEprom) &dc390_eepromBuf[index][id << 2];
> +
> + pDCB->DevMode = prom->EE_MODE1;
> + pDCB->NegoPeriod =
> + (dc390_clock_period1[prom->EE_SPEED] * 25) >> 2;
> + pDCB->CtrlR3 = FAST_CLK;
> + pDCB->CtrlR4 = pACB->glitch_cfg | CTRL4_RESERVED;
> + if (dc390_eepromBuf[index][EE_MODE2] & ACTIVE_NEGATION)
> + pDCB->CtrlR4 |= NEGATE_REQACKDATA | NEGATE_REQACK;
> }
> - return -ENOMEM;
> +
> + pACB->DCBmap[id] |= (1 << lun);
> + dc390_updateDCB(pACB, pDCB);
> +
> + pACB->scan_devices = 1;
> + scsi_device->hostdata = pDCB;
> + return 0;
> }
>
> /**
> @@ -1860,11 +1818,37 @@
> {
> PACB pACB = (PACB) scsi_device->host->hostdata;
> PDCB pDCB = (PDCB) scsi_device->hostdata;
> + PDCB pPrevDCB = pACB->pLinkDCB;
> +
> pACB->scan_devices = 0;
> - if (pDCB != NULL)
> - dc390_remove_dev(pACB, pDCB);
> - else
> - printk(KERN_ERR"%s() called for non-existing device!\n", __FUNCTION__);
> +
> + BUG_ON(pDCB->GoingSRBCnt > 1);
> +
> + pACB->DCBmap[pDCB->TargetID] &= ~(1 << pDCB->TargetLUN);
> +
> + if (pDCB == pACB->pLinkDCB) {
> + if (pACB->pLastDCB == pDCB) {
> + pDCB->pNextDCB = NULL;
> + pACB->pLastDCB = NULL;
> + }
> + pACB->pLinkDCB = pDCB->pNextDCB;
> + } else {
> + while (pPrevDCB->pNextDCB != pDCB)
> + pPrevDCB = pPrevDCB->pNextDCB;
> + pPrevDCB->pNextDCB = pDCB->pNextDCB;
> + if (pDCB == pACB->pLastDCB)
> + pACB->pLastDCB = pPrevDCB;
> + }
> +
> + if (pDCB == pACB->pActiveDCB)
> + pACB->pActiveDCB = NULL;
> + if (pDCB == pACB->pLinkDCB)
> + pACB->pLinkDCB = pDCB->pNextDCB;
> + if (pDCB == pACB->pDCBRunRobin)
> + pACB->pDCBRunRobin = pDCB->pNextDCB;
> + kfree(pDCB);
> +
> + pACB->DCBCnt--;
> }
>
> static int dc390_slave_configure(struct scsi_device *scsi_device)
> @@ -1966,52 +1950,6 @@
> return ret;
> }
>
> -static void __devexit dc390_freeDCBs (struct Scsi_Host *host)
> -{
> - PDCB pDCB, nDCB;
> - PACB pACB = (PACB) host->hostdata;
> -
> - pDCB = pACB->pLinkDCB;
> - if (!pDCB) return;
> - do
> - {
> - nDCB = pDCB->pNextDCB;
> - DCBDEBUG(printk (KERN_INFO "DC390: Free DCB (ID %i, LUN %i): %p\n",\
> - pDCB->TargetID, pDCB->TargetLUN, pDCB));
> - //kfree (pDCB);
> - dc390_remove_dev (pACB, pDCB);
> - pDCB = nDCB;
> - } while (pDCB && pACB->pLinkDCB);
> -}
> -
> -/***********************************************************************
> - * Function : static int dc390_shutdown (struct Scsi_Host *host)
> - *
> - * Purpose : does a clean (we hope) shutdown of the SCSI chip.
> - * Use prior to dumping core, unloading the driver, etc.
> - *
> - * Returns : 0 on success
> - ***********************************************************************/
> -static int __devexit dc390_shutdown (struct Scsi_Host *host)
> -{
> - UCHAR bval;
> - PACB pACB = (PACB) host->hostdata;
> -
> -/* pACB->soft_reset(host); */
> -
> - printk(KERN_INFO "DC390: shutdown\n");
> -
> - pACB->ACBFlag = RESET_DEV;
> - bval = DC390_read8 (CtrlReg1);
> - bval |= DIS_INT_ON_SCSI_RST;
> - DC390_write8 (CtrlReg1, bval); /* disable interrupt */
> - if (pACB->Gmode2 & RST_SCSI_BUS)
> - dc390_ResetSCSIBus (pACB);
> -
> - if (timer_pending (&pACB->Waiting_Timer)) del_timer (&pACB->Waiting_Timer);
> - return( 0 );
> -}
> -
> /**
> * dc390_remove_one - Called to remove a single instance of the adapter.
> *
> @@ -2022,22 +1960,22 @@
> struct Scsi_Host *scsi_host = pci_get_drvdata(dev);
> unsigned long iflags;
> PACB pACB = (PACB) scsi_host->hostdata;
> + u8 bval;
>
> scsi_remove_host(scsi_host);
>
> spin_lock_irqsave(scsi_host->host_lock, iflags);
> + pACB->ACBFlag = RESET_DEV;
> + bval = DC390_read8(CtrlReg1) | DIS_INT_ON_SCSI_RST;
> + DC390_write8 (CtrlReg1, bval); /* disable interrupt */
> + if (pACB->Gmode2 & RST_SCSI_BUS)
> + dc390_ResetSCSIBus(pACB);
> + spin_unlock_irqrestore(scsi_host->host_lock, iflags);
>
> - /* TO DO: We should check for outstanding commands first. */
> - dc390_shutdown(scsi_host);
> -
> - if (scsi_host->irq != SCSI_IRQ_NONE) {
> - DEBUG0(printk(KERN_INFO "DC390: Free IRQ %i\n", scsi_host->irq));
> - free_irq(scsi_host->irq, pACB);
> - }
> + del_timer_sync(&pACB->Waiting_Timer);
>
> + free_irq(scsi_host->irq, pACB);
> release_region(scsi_host->io_port, scsi_host->n_io_port);
> - dc390_freeDCBs(scsi_host);
> - spin_unlock_irqrestore(scsi_host->host_lock, iflags);
>
> pci_disable_device(dev);
> scsi_host_put(scsi_host);
>
>
---
Guennadi Liakhovetski
^ permalink raw reply [flat|nested] 8+ messages in thread
end of thread, other threads:[~2004-06-23 22:20 UTC | newest]
Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2004-06-06 12:41 [PATCH] some tmscsim consolidation Christoph Hellwig
2004-06-06 20:22 ` Guennadi Liakhovetski
2004-06-06 20:33 ` Christoph Hellwig
2004-06-07 20:37 ` Guennadi Liakhovetski
2004-06-20 16:21 ` Christoph Hellwig
2004-06-20 20:26 ` Guennadi Liakhovetski
2004-06-23 15:59 ` Christoph Hellwig
2004-06-23 22:16 ` Guennadi Liakhovetski
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox