From: Jeff Garzik <jgarzik@mandrakesoft.com>
To: Mike Phillips <mikep@linuxtr.net>
Cc: linux-kernel@vger.kernel.org, alan@lxorguk.ukuu.org.uk,
torvalds@transmeta.com
Subject: Re: [PATCH] Updated Olympic Driver
Date: Wed, 18 Apr 2001 12:00:41 -0400 [thread overview]
Message-ID: <3ADDBA29.C3ADDD60@mandrakesoft.com> (raw)
In-Reply-To: <Pine.LNX.4.10.10104181102180.5458-100000@www.linuxtr.net>
Mike Phillips wrote:
hey Mike :)
> diff -urN --exclude-from=dontdiff linux-2.4.3.clean/drivers/net/Space.c linux-2.4.3.olympic/drivers/net/Space.c
> --- linux-2.4.3.clean/drivers/net/Space.c Tue Feb 13 16:15:05 2001
> +++ linux-2.4.3.olympic/drivers/net/Space.c Sun Apr 1 19:22:08 2001
> @@ -544,7 +544,6 @@
> #ifdef CONFIG_TR
> /* Token-ring device probe */
> extern int ibmtr_probe(struct net_device *);
> -extern int olympic_probe(struct net_device *);
> extern int smctr_probe(struct net_device *);
*cheer*
> static char *version =
> -"Olympic.c v0.5.C 12/23/00 - Peter De Schrijver & Mike Phillips" ;
> -
> -static struct pci_device_id olympic_pci_tbl[] __initdata = {
> - { PCI_VENDOR_ID_IBM, PCI_DEVICE_ID_IBM_TR_WAKE, PCI_ANY_ID, PCI_ANY_ID, },
> - { } /* Terminating entry */
> -};
> -MODULE_DEVICE_TABLE(pci, olympic_pci_tbl);
> -
> +"Olympic.c v0.9.C 4/18/01 - Peter De Schrijver & Mike Phillips" ;
Define your strings like "version[]" because they take up a bit less
space in the output. Also, you can most likely mark your string
__devinitdata -- typically for network drivers, you want to always print
out your version on module load; and when built into the kernel, print
out the version once at least one device has been found.
> MODULE_PARM(ringspeed, "1-" __MODULE_STRING(OLYMPIC_MAX_ADAPTERS) "i");
> MODULE_PARM(pkt_buf_sz, "1-" __MODULE_STRING(OLYMPIC_MAX_ADAPTERS) "i") ;
> MODULE_PARM(message_level, "1-" __MODULE_STRING(OLYMPIC_MAX_ADAPTERS) "i") ;
MODULE_PARM_DESC here too might be nice
> +static struct pci_device_id olympic_pci_tbl[] __devinitdata = {
> + {PCI_VENDOR_ID_IBM,PCI_DEVICE_ID_IBM_TR_WAKE,PCI_ANY_ID,PCI_ANY_ID,},
> + { } /* Terminating Entry */
> +};
> +MODULE_DEVICE_TABLE(pci,olympic_pci_tbl) ;
> +
> +static int __init olympic_probe(struct pci_dev *pdev, const struct pci_device_id *ent);
1) prototypes don't need __init
2) this is a cardbus (hotplug) capable driver, to olympic_probe should
be __devinit not __init
> -int __init olympic_probe(struct net_device *dev)
> +static int __init olympic_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
ditto
> + olympic_priv->olympic_mmio = ioremap(pci_resource_start(pdev,1),256);
> + olympic_priv->olympic_lap = ioremap(pci_resource_start(pdev,2),2048);
check both of these for NULL return value. since you have a lot of
error cases, as is typical in a probe function, you might consider the
goto-exit style used by many drivers in drivers/net/*.c. Just grep for
goto ;-) Using gotos for error exit handling greatly increases the
readability of the code and greatly reduces the likelihood of bugs due
to cut-n-paste (or forgetting to cut-n-paste).
> + dev->open=&olympic_open;
> + dev->hard_start_xmit=&olympic_xmit;
> + dev->change_mtu=&olympic_change_mtu;
> + dev->stop=&olympic_close;
> + dev->do_ioctl=NULL;
> + dev->set_multicast_list=&olympic_set_rx_mode;
> + dev->get_stats=&olympic_get_stats ;
> + dev->set_mac_address=&olympic_set_mac_address ;
I think you're missing SET_MODULE_OWNER(dev).. use that here, and
remove all calls to MOD_{INC,DEC}_USE_COUNT...
> + register_netdev(dev) ;
check return code
> + if (olympic_priv->olympic_network_monitor) {
> + __u8 *oat ;
> + __u8 *opt ;
> + oat = (__u8 *)(olympic_priv->olympic_lap + olympic_priv->olympic_addr_table_addr) ;
> + opt = (__u8 *)(olympic_priv->olympic_lap + olympic_priv->olympic_parms_addr) ;
prefer kernel standard "u8" type
> + /*
> + * Read sisr but don't reset it yet.
> + * The indication bit may have been set but the interrupt latch
> + * bit may not be set, so we'd lose the interrupt later.
> + */
> + sisr=readl(olympic_mmio+SISR) ;
> if (!(sisr & SISR_MI)) /* Interrupt isn't for us */
> return ;
> + sisr=readl(olympic_mmio+SISR_RR) ; /* Read & Reset sisr */
you should also check for 0xFFFFFFFF, which will happen if the hardware
disappears...
> +static void __devexit olympic_remove_one(struct pci_dev *pdev)
> + if (olympic_priv->olympic_network_monitor) {
> + char proc_name[20] ;
> + strcpy(proc_name,"net/olympic_") ;
> + strcat(proc_name,dev->name) ;
> + remove_proc_entry(proc_name,NULL);
> }
> + unregister_trdev(dev) ;
> + iounmap(olympic_priv->olympic_mmio) ;
> + iounmap(olympic_priv->olympic_lap) ;
> + pci_release_regions(pdev) ;
> + kfree(dev) ;
> +}
call pci_set_drvdata(pdev,NULL) to clear your tracks
> diff -urN --exclude-from=dontdiff linux-2.4.3.clean/drivers/net/tokenring/olympic.h linux-2.4.3.olympic/drivers/net/tokenring/olympic.h
> --- linux-2.4.3.clean/drivers/net/tokenring/olympic.h Tue Mar 6 22:28:35 2001
> +++ linux-2.4.3.olympic/drivers/net/tokenring/olympic.h Wed Apr 18 08:38:07 2001
> @@ -263,10 +264,12 @@
> volatile int trb_queued; /* True if a TRB is posted */
> wait_queue_head_t trb_wait ;
>
> + /* These must be on a 4 byte boundary. */
> struct olympic_rx_desc olympic_rx_ring[OLYMPIC_RX_RING_SIZE];
> struct olympic_tx_desc olympic_tx_ring[OLYMPIC_TX_RING_SIZE];
> struct olympic_rx_status olympic_rx_status_ring[OLYMPIC_RX_RING_SIZE];
> struct olympic_tx_status olympic_tx_status_ring[OLYMPIC_TX_RING_SIZE];
With PCI DMA you (theoretically) never pass any members of your private
struct directly to the chip. thus, either your comment or code is
wrong...
> @@ -274,9 +277,13 @@
> __u16 olympic_lan_status ;
> __u8 olympic_ring_speed ;
> __u16 pkt_buf_sz ;
> - __u8 olympic_receive_options, olympic_copy_all_options, olympic_message_level;
> + __u8 olympic_receive_options, olympic_copy_all_options,olympic_message_level, olympic_network_monitor;
> __u16 olympic_addr_table_addr, olympic_parms_addr ;
> __u8 olympic_laa[6] ;
> + __u32 rx_ring_dma_addr;
> + __u32 rx_status_ring_dma_addr;
> + __u32 tx_ring_dma_addr;
> + __u32 tx_status_ring_dma_addr;
ditto comments about using standard kernel types
--
Jeff Garzik | "The universe is like a safe to which there is a
Building 1024 | combination -- but the combination is locked up
MandrakeSoft | in the safe." -- Peter DeVries
next prev parent reply other threads:[~2001-04-18 16:00 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2001-04-18 16:07 [PATCH] Updated Olympic Driver Mike Phillips
2001-04-18 16:00 ` Jeff Garzik [this message]
-- strict thread matches above, loose matches on Subject: below --
2001-04-18 16:29 mike_phillips
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=3ADDBA29.C3ADDD60@mandrakesoft.com \
--to=jgarzik@mandrakesoft.com \
--cc=alan@lxorguk.ukuu.org.uk \
--cc=linux-kernel@vger.kernel.org \
--cc=mikep@linuxtr.net \
--cc=torvalds@transmeta.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