Skip to content

Commit

Permalink
orinoco: allow driver to specify netdev_ops
Browse files Browse the repository at this point in the history
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: David Kilroy <kilroyd@googlemail.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
  • Loading branch information
David Kilroy authored and John W. Linville committed May 3, 2010
1 parent b42f207 commit 593ef09
Show file tree
Hide file tree
Showing 9 changed files with 37 additions and 16 deletions.
2 changes: 1 addition & 1 deletion drivers/net/wireless/orinoco/airport.c
Original file line number Diff line number Diff line change
Expand Up @@ -210,7 +210,7 @@ airport_attach(struct macio_dev *mdev, const struct of_device_id *match)
}

/* 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");
goto failed;
}
Expand Down
28 changes: 20 additions & 8 deletions drivers/net/wireless/orinoco/main.c
Original file line number Diff line number Diff line change
Expand Up @@ -253,7 +253,7 @@ void set_port_type(struct orinoco_private *priv)
/* Device methods */
/********************************************************************/

static int orinoco_open(struct net_device *dev)
int orinoco_open(struct net_device *dev)
{
struct orinoco_private *priv = ndev_priv(dev);
unsigned long flags;
Expand All @@ -271,8 +271,9 @@ static int orinoco_open(struct net_device *dev)

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);
int err = 0;
Expand All @@ -290,15 +291,17 @@ static int orinoco_stop(struct net_device *dev)

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);

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);
unsigned long flags;
Expand All @@ -312,8 +315,9 @@ static void orinoco_set_multicast_list(struct net_device *dev)
__orinoco_set_multicast_list(dev);
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);

Expand All @@ -329,6 +333,7 @@ static int orinoco_change_mtu(struct net_device *dev, int new_mtu)

return 0;
}
EXPORT_SYMBOL(orinoco_change_mtu);

/********************************************************************/
/* Tx path */
Expand Down Expand Up @@ -614,7 +619,7 @@ static void __orinoco_ev_txexc(struct net_device *dev, hermes_t *hw)
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 net_device_stats *stats = &priv->stats;
Expand All @@ -629,6 +634,7 @@ static void orinoco_tx_timeout(struct net_device *dev)

schedule_work(&priv->reset_work);
}
EXPORT_SYMBOL(orinoco_tx_timeout);

/********************************************************************/
/* Rx path (data frames) */
Expand Down Expand Up @@ -2192,7 +2198,8 @@ EXPORT_SYMBOL(alloc_orinocodev);
*/
int orinoco_if_add(struct orinoco_private *priv,
unsigned long base_addr,
unsigned int irq)
unsigned int irq,
const struct net_device_ops *ops)
{
struct wiphy *wiphy = priv_to_wiphy(priv);
struct wireless_dev *wdev;
Expand All @@ -2211,12 +2218,17 @@ int orinoco_if_add(struct orinoco_private *priv,

/* Setup / override net_device fields */
dev->ieee80211_ptr = wdev;
dev->netdev_ops = &orinoco_netdev_ops;
dev->watchdog_timeo = HZ; /* 1 second timeout */
dev->wireless_handlers = &orinoco_handler_def;
#ifdef WIRELESS_SPY
dev->wireless_data = &priv->wireless_data;
#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 */

/* Reserve space in skb for the SNAP header */
Expand Down
11 changes: 10 additions & 1 deletion drivers/net/wireless/orinoco/orinoco.h
Original file line number Diff line number Diff line change
Expand Up @@ -190,12 +190,21 @@ extern void free_orinocodev(struct orinoco_private *priv);
extern int orinoco_init(struct orinoco_private *priv);
extern int orinoco_if_add(struct orinoco_private *priv,
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 int orinoco_up(struct orinoco_private *priv);
extern void orinoco_down(struct orinoco_private *priv);
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 */
/********************************************************************/
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/wireless/orinoco/orinoco_cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -296,7 +296,7 @@ orinoco_cs_config(struct pcmcia_device *link)

/* Register an interface with the stack */
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");
goto failed;
}
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/wireless/orinoco/orinoco_nortel.c
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ static int orinoco_nortel_init_one(struct pci_dev *pdev,
goto fail;
}

err = orinoco_if_add(priv, 0, 0);
err = orinoco_if_add(priv, 0, 0, NULL);
if (err) {
printk(KERN_ERR PFX "orinoco_if_add() failed\n");
goto fail;
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/wireless/orinoco/orinoco_pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -170,7 +170,7 @@ static int orinoco_pci_init_one(struct pci_dev *pdev,
goto fail;
}

err = orinoco_if_add(priv, 0, 0);
err = orinoco_if_add(priv, 0, 0, NULL);
if (err) {
printk(KERN_ERR PFX "orinoco_if_add() failed\n");
goto fail;
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/wireless/orinoco/orinoco_plx.c
Original file line number Diff line number Diff line change
Expand Up @@ -259,7 +259,7 @@ static int orinoco_plx_init_one(struct pci_dev *pdev,
goto fail;
}

err = orinoco_if_add(priv, 0, 0);
err = orinoco_if_add(priv, 0, 0, NULL);
if (err) {
printk(KERN_ERR PFX "orinoco_if_add() failed\n");
goto fail;
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/wireless/orinoco/orinoco_tmd.c
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ static int orinoco_tmd_init_one(struct pci_dev *pdev,
goto fail;
}

err = orinoco_if_add(priv, 0, 0);
err = orinoco_if_add(priv, 0, 0, NULL);
if (err) {
printk(KERN_ERR PFX "orinoco_if_add() failed\n");
goto fail;
Expand Down
2 changes: 1 addition & 1 deletion drivers/net/wireless/orinoco/spectrum_cs.c
Original file line number Diff line number Diff line change
Expand Up @@ -374,7 +374,7 @@ spectrum_cs_config(struct pcmcia_device *link)

/* Register an interface with the stack */
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");
goto failed;
}
Expand Down

0 comments on commit 593ef09

Please sign in to comment.