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: David Kilroy <kilroyd@googlemail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
This commit is contained in:
committed by
John W. Linville
parent
b42f2074de
commit
593ef09c9e
@@ -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)
|
|||||||
/* 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)
|
|||||||
|
|
||||||
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)
|
|||||||
|
|
||||||
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)
|
|||||||
__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)
|
|||||||
|
|
||||||
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)
|
|||||||
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)
|
|||||||
|
|
||||||
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);
|
|||||||
*/
|
*/
|
||||||
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,
|
|||||||
|
|
||||||
/* 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);
|
|||||||
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)
|
|||||||
|
|
||||||
/* 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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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,
|
|||||||
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)
|
|||||||
|
|
||||||
/* 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;
|
||||||
}
|
}
|
||||||
|
Reference in New Issue
Block a user