netdev.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Michael Buesch <mb@bu3sch.de>
To: Mithlesh Thukral <mithlesh@netxen.com>
Cc: netdev@vger.kernel.org, amitkale@netxen.com, jeff@garzik.org,
	netxenproj@linsyssoft.com, rob@netxen.com
Subject: Re: [PATCH 3/3] NetXen: Fix the rmmod error on PBlades due incorrect cleanup
Date: Fri, 22 Jun 2007 12:50:17 +0200	[thread overview]
Message-ID: <200706221250.18194.mb@bu3sch.de> (raw)
In-Reply-To: <200706220842.l5M8gcsD021825@dut39.unminc.com>

On Friday 22 June 2007 10:42:38 Mithlesh Thukral wrote:
> diff --git a/drivers/net/netxen/netxen_nic_hw.c b/drivers/net/netxen/netxen_nic_hw.c
> index 4e958c9..f0df6fb 100644
> --- a/drivers/net/netxen/netxen_nic_hw.c
> +++ b/drivers/net/netxen/netxen_nic_hw.c
> @@ -378,6 +378,7 @@ int netxen_nic_hw_resources(struct netxe
>  						   crb_rcvpeg_state));
>  		while (state != PHAN_PEG_RCV_INITIALIZED && loops < 20) {
>  			udelay(100);
> +			schedule();
>  			/* Window 1 call */
>  			state = readl(NETXEN_CRB_NORMALIZE(adapter,
>  							   recv_crb_registers

Better do msleep(1); instead of udelay+schedule.

> @@ -700,7 +701,7 @@ void netxen_nic_pci_change_crbwindow(str
>  		adapter->curr_window = 0;
>  }
>  
> -void netxen_load_firmware(struct netxen_adapter *adapter)
> +int netxen_load_firmware(struct netxen_adapter *adapter)
>  {
>  	int i;
>  	u32 data, size = 0;
> @@ -712,15 +713,25 @@ void netxen_load_firmware(struct netxen_
>  	writel(1, NETXEN_CRB_NORMALIZE(adapter, NETXEN_ROMUSB_GLB_CAS_RST));
>  
>  	for (i = 0; i < size; i++) {
> -		if (netxen_rom_fast_read(adapter, flashaddr, (int *)&data) != 0) {
> -			DPRINTK(ERR,
> -				"Error in netxen_rom_fast_read(). Will skip"
> -				"loading flash image\n");
> -			return;
> +		while (netxen_rom_fast_read(adapter, flashaddr, (int *)&data) != 0) {
> +			long timeout = 2 * HZ;
> +			while (timeout) {
> +			    if (signal_pending(current)) {
> +				printk( "%s: Got a signal, exiting\n", __FUNCTION__ );
> +				return -1;
> +			    }
> +			    set_current_state(TASK_INTERRUPTIBLE);
> +			    timeout = schedule_timeout(timeout);
> +			}

You're opencoding msleep_interruptible() here?
And this sleeps two seconds between each rom-read attempt. Is that
really your intention?
I'd say better attempt to read more often and sleep less each time.

>  		off = netxen_nic_pci_set_window(adapter, memaddr);
>  		addr = pci_base_offset(adapter, off);
>  		writel(data, addr);
> +		while (readl(addr) != data) {
> +			mdelay(100);
> +			writel(data, addr);
> +		}

Add a timeout. Else this will result in a system hang, if the hardware is faulty.

> diff --git a/drivers/net/netxen/netxen_nic_init.c b/drivers/net/netxen/netxen_nic_init.c
> index 15f6dc5..8f5f4f8 100644
> --- a/drivers/net/netxen/netxen_nic_init.c
> +++ b/drivers/net/netxen/netxen_nic_init.c
> @@ -408,8 +408,12 @@ static inline int
>  do_rom_fast_read(struct netxen_adapter *adapter, int addr, int *valp)
>  {
>  	if (jiffies > (last_schedule_time + (8 * HZ))) {
> -		last_schedule_time = jiffies;
> -		schedule();
> +		if (last_schedule_time) {
> +			last_schedule_time = jiffies;
> +			schedule();
> +		} else {
> +			last_schedule_time = jiffies;
> +		}

Why this strange thing?
I'd simply call cond_resched() instead of all this custom
schedule timekeeping. That's best for system latency.

> -void netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val)
> +int netxen_phantom_init(struct netxen_adapter *adapter, int pegtune_val)
>  {
>  	u32 val = 0;
> -	int loops = 0;
>  
>  	if (!pegtune_val) {
> -		val = readl(NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE));
> -		while (val != PHAN_INITIALIZE_COMPLETE && 
> -			val != PHAN_INITIALIZE_ACK && loops < 200000) {
> -			udelay(100);
> -			schedule();
> -			val =
> -			    readl(NETXEN_CRB_NORMALIZE
> +		do {
> +			long timeout = 10 * HZ;
> +			while (timeout) {
> +				if (signal_pending(current)) {
> +					printk(KERN_INFO"%s: Got a signal, exiting\n", __FUNCTION__ );
> +					printk(KERN_INFO"%s: val=0x%x, pegtune_val=0x%x\n", __FUNCTION__,
> +						val, pegtune_val );
> +					return -1;
> +				}
> +				set_current_state(TASK_INTERRUPTIBLE);
> +				timeout = schedule_timeout(timeout);
> +			}
> +			val = readl(NETXEN_CRB_NORMALIZE
>  				  (adapter, CRB_CMDPEG_STATE));

msleep_interruptible()?

> @@ -1278,11 +1285,13 @@ int netxen_process_cmd_ring(unsigned lon
>  		if (skb && (cmpxchg(&buffer->skb, skb, 0) == skb)) {
>  			pci_unmap_single(pdev, frag->dma, frag->length,
>  					 PCI_DMA_TODEVICE);
> +			frag->dma = (u64) NULL;

??? Cast the NULL pointer to u64?

>  			for (i = 1; i < buffer->frag_count; i++) {
>  				DPRINTK(INFO, "getting fragment no %d\n", i);
>  				frag++;	/* Get the next frag */
>  				pci_unmap_page(pdev, frag->dma, frag->length,
>  					       PCI_DMA_TODEVICE);
> +				frag->dma = (u64) NULL;

???

> @@ -547,13 +546,7 @@ #endif
>  				NETXEN_ROMUSB_GLB_PEGTUNE_DONE));
>  		/* Handshake with the card before we register the devices. */
>  		netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
> -
> -	       /* leave the hw in the same state as reboot */
> -	       writel(0, NETXEN_CRB_NORMALIZE(adapter, CRB_CMDPEG_STATE));
> -	       netxen_pinit_from_rom(adapter, 0);
> -	       udelay(500);
> -	       netxen_load_firmware(adapter);
> -	       netxen_phantom_init(adapter, NETXEN_NIC_PEG_TUNE);
> +		mdelay(2000);

Two seconds delay? No! Too long, sleep.

> @@ -653,30 +646,21 @@ static void __devexit netxen_nic_remove(
>  
>  	netdev = adapter->netdev;
>  
> -	netxen_nic_disable_int(adapter);
> -	if (adapter->irq)
> -		free_irq(adapter->irq, adapter);
> -	
> +	unregister_netdev(netdev);
> +	mdelay(3000);

Toooo long, sleep.

> @@ -696,17 +680,73 @@ static void __devexit netxen_nic_remove(
>  		}
>  	}
>  
> -	unregister_netdev(netdev);
> +	if (adapter->flags & NETXEN_NIC_MSI_ENABLED)
> +		pci_disable_msi(pdev);
>  
>  	vfree(adapter->cmd_buf_arr);
>  
> +	pci_disable_device(pdev);
> +
> +	if (adapter->portnum == 0) {
> +		if (init_firmware_done) {
> +			dma_watchdog_shutdown_request(adapter);
> +			mdelay(100);
> +			i = 100;	
> +			while ((dma_watchdog_shutdown_poll_result(adapter) != 1) && i) {
> +				printk(KERN_INFO"dma_watchdog_shutdown_poll still in progress\n");
> +				mdelay(100);

0.1 seconds delay is too long IMO, too. Sleep!

> +		dma_watchdog_shutdown_request(adapter);
> +		mdelay(100);
> +		i = 100;	
> +		while ((dma_watchdog_shutdown_poll_result(adapter) != 1) && i) {
> +			printk(KERN_INFO"dma_watchdog_shutdown_poll still in progress\n");
> +			mdelay(100);

same...


-- 
Greetings Michael.

      reply	other threads:[~2007-06-22 10:50 UTC|newest]

Thread overview: 2+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-06-22  8:42 [PATCH 3/3] NetXen: Fix the rmmod error on PBlades due incorrect cleanup Mithlesh Thukral
2007-06-22 10:50 ` Michael Buesch [this message]

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=200706221250.18194.mb@bu3sch.de \
    --to=mb@bu3sch.de \
    --cc=amitkale@netxen.com \
    --cc=jeff@garzik.org \
    --cc=mithlesh@netxen.com \
    --cc=netdev@vger.kernel.org \
    --cc=netxenproj@linsyssoft.com \
    --cc=rob@netxen.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).