提交 593ef09c 编写于 作者: D David Kilroy 提交者: John W. Linville

orinoco: allow driver to specify netdev_ops

Allow the main drivers to specify a custom version of the net_device_ops
structure. This is required by orinoco_usb to supply a separate transmit
function.

Export existing net_device_ops callbacks so that the drivers can reuse
some of the existing code.
Signed-off-by: NDavid Kilroy <kilroyd@googlemail.com>
Signed-off-by: NJohn W. Linville <linville@tuxdriver.com>
上级 b42f2074
...@@ -210,7 +210,7 @@ airport_attach(struct macio_dev *mdev, const struct of_device_id *match) ...@@ -210,7 +210,7 @@ airport_attach(struct macio_dev *mdev, const struct of_device_id *match)
} }
/* Register an interface with the stack */ /* Register an interface with the stack */
if (orinoco_if_add(priv, phys_addr, card->irq) != 0) { if (orinoco_if_add(priv, phys_addr, card->irq, NULL) != 0) {
printk(KERN_ERR PFX "orinoco_if_add() failed\n"); printk(KERN_ERR PFX "orinoco_if_add() failed\n");
goto failed; goto failed;
} }
......
...@@ -253,7 +253,7 @@ void set_port_type(struct orinoco_private *priv) ...@@ -253,7 +253,7 @@ void set_port_type(struct orinoco_private *priv)
/* Device methods */ /* Device methods */
/********************************************************************/ /********************************************************************/
static int orinoco_open(struct net_device *dev) int orinoco_open(struct net_device *dev)
{ {
struct orinoco_private *priv = ndev_priv(dev); struct orinoco_private *priv = ndev_priv(dev);
unsigned long flags; unsigned long flags;
...@@ -271,8 +271,9 @@ static int orinoco_open(struct net_device *dev) ...@@ -271,8 +271,9 @@ static int orinoco_open(struct net_device *dev)
return err; return err;
} }
EXPORT_SYMBOL(orinoco_open);
static int orinoco_stop(struct net_device *dev) int orinoco_stop(struct net_device *dev)
{ {
struct orinoco_private *priv = ndev_priv(dev); struct orinoco_private *priv = ndev_priv(dev);
int err = 0; int err = 0;
...@@ -290,15 +291,17 @@ static int orinoco_stop(struct net_device *dev) ...@@ -290,15 +291,17 @@ static int orinoco_stop(struct net_device *dev)
return err; return err;
} }
EXPORT_SYMBOL(orinoco_stop);
static struct net_device_stats *orinoco_get_stats(struct net_device *dev) struct net_device_stats *orinoco_get_stats(struct net_device *dev)
{ {
struct orinoco_private *priv = ndev_priv(dev); struct orinoco_private *priv = ndev_priv(dev);
return &priv->stats; return &priv->stats;
} }
EXPORT_SYMBOL(orinoco_get_stats);
static void orinoco_set_multicast_list(struct net_device *dev) void orinoco_set_multicast_list(struct net_device *dev)
{ {
struct orinoco_private *priv = ndev_priv(dev); struct orinoco_private *priv = ndev_priv(dev);
unsigned long flags; unsigned long flags;
...@@ -312,8 +315,9 @@ static void orinoco_set_multicast_list(struct net_device *dev) ...@@ -312,8 +315,9 @@ static void orinoco_set_multicast_list(struct net_device *dev)
__orinoco_set_multicast_list(dev); __orinoco_set_multicast_list(dev);
orinoco_unlock(priv, &flags); orinoco_unlock(priv, &flags);
} }
EXPORT_SYMBOL(orinoco_set_multicast_list);
static int orinoco_change_mtu(struct net_device *dev, int new_mtu) int orinoco_change_mtu(struct net_device *dev, int new_mtu)
{ {
struct orinoco_private *priv = ndev_priv(dev); struct orinoco_private *priv = ndev_priv(dev);
...@@ -329,6 +333,7 @@ static int orinoco_change_mtu(struct net_device *dev, int new_mtu) ...@@ -329,6 +333,7 @@ static int orinoco_change_mtu(struct net_device *dev, int new_mtu)
return 0; return 0;
} }
EXPORT_SYMBOL(orinoco_change_mtu);
/********************************************************************/ /********************************************************************/
/* Tx path */ /* Tx path */
...@@ -614,7 +619,7 @@ static void __orinoco_ev_txexc(struct net_device *dev, hermes_t *hw) ...@@ -614,7 +619,7 @@ static void __orinoco_ev_txexc(struct net_device *dev, hermes_t *hw)
netif_wake_queue(dev); netif_wake_queue(dev);
} }
static void orinoco_tx_timeout(struct net_device *dev) void orinoco_tx_timeout(struct net_device *dev)
{ {
struct orinoco_private *priv = ndev_priv(dev); struct orinoco_private *priv = ndev_priv(dev);
struct net_device_stats *stats = &priv->stats; struct net_device_stats *stats = &priv->stats;
...@@ -629,6 +634,7 @@ static void orinoco_tx_timeout(struct net_device *dev) ...@@ -629,6 +634,7 @@ static void orinoco_tx_timeout(struct net_device *dev)
schedule_work(&priv->reset_work); schedule_work(&priv->reset_work);
} }
EXPORT_SYMBOL(orinoco_tx_timeout);
/********************************************************************/ /********************************************************************/
/* Rx path (data frames) */ /* Rx path (data frames) */
...@@ -2192,7 +2198,8 @@ EXPORT_SYMBOL(alloc_orinocodev); ...@@ -2192,7 +2198,8 @@ EXPORT_SYMBOL(alloc_orinocodev);
*/ */
int orinoco_if_add(struct orinoco_private *priv, int orinoco_if_add(struct orinoco_private *priv,
unsigned long base_addr, unsigned long base_addr,
unsigned int irq) unsigned int irq,
const struct net_device_ops *ops)
{ {
struct wiphy *wiphy = priv_to_wiphy(priv); struct wiphy *wiphy = priv_to_wiphy(priv);
struct wireless_dev *wdev; struct wireless_dev *wdev;
...@@ -2211,12 +2218,17 @@ int orinoco_if_add(struct orinoco_private *priv, ...@@ -2211,12 +2218,17 @@ int orinoco_if_add(struct orinoco_private *priv,
/* Setup / override net_device fields */ /* Setup / override net_device fields */
dev->ieee80211_ptr = wdev; dev->ieee80211_ptr = wdev;
dev->netdev_ops = &orinoco_netdev_ops;
dev->watchdog_timeo = HZ; /* 1 second timeout */ dev->watchdog_timeo = HZ; /* 1 second timeout */
dev->wireless_handlers = &orinoco_handler_def; dev->wireless_handlers = &orinoco_handler_def;
#ifdef WIRELESS_SPY #ifdef WIRELESS_SPY
dev->wireless_data = &priv->wireless_data; dev->wireless_data = &priv->wireless_data;
#endif #endif
/* Default to standard ops if not set */
if (ops)
dev->netdev_ops = ops;
else
dev->netdev_ops = &orinoco_netdev_ops;
/* we use the default eth_mac_addr for setting the MAC addr */ /* we use the default eth_mac_addr for setting the MAC addr */
/* Reserve space in skb for the SNAP header */ /* Reserve space in skb for the SNAP header */
......
...@@ -190,12 +190,21 @@ extern void free_orinocodev(struct orinoco_private *priv); ...@@ -190,12 +190,21 @@ extern void free_orinocodev(struct orinoco_private *priv);
extern int orinoco_init(struct orinoco_private *priv); extern int orinoco_init(struct orinoco_private *priv);
extern int orinoco_if_add(struct orinoco_private *priv, extern int orinoco_if_add(struct orinoco_private *priv,
unsigned long base_addr, unsigned long base_addr,
unsigned int irq); unsigned int irq,
const struct net_device_ops *ops);
extern void orinoco_if_del(struct orinoco_private *priv); extern void orinoco_if_del(struct orinoco_private *priv);
extern int orinoco_up(struct orinoco_private *priv); extern int orinoco_up(struct orinoco_private *priv);
extern void orinoco_down(struct orinoco_private *priv); extern void orinoco_down(struct orinoco_private *priv);
extern irqreturn_t orinoco_interrupt(int irq, void *dev_id); extern irqreturn_t orinoco_interrupt(int irq, void *dev_id);
/* Common ndo functions exported for reuse by orinoco_usb */
int orinoco_open(struct net_device *dev);
int orinoco_stop(struct net_device *dev);
struct net_device_stats *orinoco_get_stats(struct net_device *dev);
void orinoco_set_multicast_list(struct net_device *dev);
int orinoco_change_mtu(struct net_device *dev, int new_mtu);
void orinoco_tx_timeout(struct net_device *dev);
/********************************************************************/ /********************************************************************/
/* Locking and synchronization functions */ /* Locking and synchronization functions */
/********************************************************************/ /********************************************************************/
......
...@@ -296,7 +296,7 @@ orinoco_cs_config(struct pcmcia_device *link) ...@@ -296,7 +296,7 @@ orinoco_cs_config(struct pcmcia_device *link)
/* Register an interface with the stack */ /* Register an interface with the stack */
if (orinoco_if_add(priv, link->io.BasePort1, if (orinoco_if_add(priv, link->io.BasePort1,
link->irq.AssignedIRQ) != 0) { link->irq.AssignedIRQ, NULL) != 0) {
printk(KERN_ERR PFX "orinoco_if_add() failed\n"); printk(KERN_ERR PFX "orinoco_if_add() failed\n");
goto failed; goto failed;
} }
......
...@@ -220,7 +220,7 @@ static int orinoco_nortel_init_one(struct pci_dev *pdev, ...@@ -220,7 +220,7 @@ static int orinoco_nortel_init_one(struct pci_dev *pdev,
goto fail; goto fail;
} }
err = orinoco_if_add(priv, 0, 0); err = orinoco_if_add(priv, 0, 0, NULL);
if (err) { if (err) {
printk(KERN_ERR PFX "orinoco_if_add() failed\n"); printk(KERN_ERR PFX "orinoco_if_add() failed\n");
goto fail; goto fail;
......
...@@ -170,7 +170,7 @@ static int orinoco_pci_init_one(struct pci_dev *pdev, ...@@ -170,7 +170,7 @@ static int orinoco_pci_init_one(struct pci_dev *pdev,
goto fail; goto fail;
} }
err = orinoco_if_add(priv, 0, 0); err = orinoco_if_add(priv, 0, 0, NULL);
if (err) { if (err) {
printk(KERN_ERR PFX "orinoco_if_add() failed\n"); printk(KERN_ERR PFX "orinoco_if_add() failed\n");
goto fail; goto fail;
......
...@@ -259,7 +259,7 @@ static int orinoco_plx_init_one(struct pci_dev *pdev, ...@@ -259,7 +259,7 @@ static int orinoco_plx_init_one(struct pci_dev *pdev,
goto fail; goto fail;
} }
err = orinoco_if_add(priv, 0, 0); err = orinoco_if_add(priv, 0, 0, NULL);
if (err) { if (err) {
printk(KERN_ERR PFX "orinoco_if_add() failed\n"); printk(KERN_ERR PFX "orinoco_if_add() failed\n");
goto fail; goto fail;
......
...@@ -156,7 +156,7 @@ static int orinoco_tmd_init_one(struct pci_dev *pdev, ...@@ -156,7 +156,7 @@ static int orinoco_tmd_init_one(struct pci_dev *pdev,
goto fail; goto fail;
} }
err = orinoco_if_add(priv, 0, 0); err = orinoco_if_add(priv, 0, 0, NULL);
if (err) { if (err) {
printk(KERN_ERR PFX "orinoco_if_add() failed\n"); printk(KERN_ERR PFX "orinoco_if_add() failed\n");
goto fail; goto fail;
......
...@@ -374,7 +374,7 @@ spectrum_cs_config(struct pcmcia_device *link) ...@@ -374,7 +374,7 @@ spectrum_cs_config(struct pcmcia_device *link)
/* Register an interface with the stack */ /* Register an interface with the stack */
if (orinoco_if_add(priv, link->io.BasePort1, if (orinoco_if_add(priv, link->io.BasePort1,
link->irq.AssignedIRQ) != 0) { link->irq.AssignedIRQ, NULL) != 0) {
printk(KERN_ERR PFX "orinoco_if_add() failed\n"); printk(KERN_ERR PFX "orinoco_if_add() failed\n");
goto failed; goto failed;
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册