diff --git a/modules/mqnic/mqnic_netdev.c b/modules/mqnic/mqnic_netdev.c index 1409b699c..b4dd92918 100644 --- a/modules/mqnic/mqnic_netdev.c +++ b/modules/mqnic/mqnic_netdev.c @@ -88,6 +88,9 @@ static int mqnic_open(struct net_device *ndev) priv->tx_ring[k]->tx_queue = netdev_get_tx_queue(ndev, k); } + // enable first port + mqnic_activate_port(priv, priv->ports[0]); + priv->port_up = true; netif_tx_start_all_queues(ndev); @@ -120,6 +123,12 @@ static int mqnic_close(struct net_device *ndev) priv->port_up = false; spin_unlock_bh(&priv->stats_lock); + // disable ports + for (k = 0; k < priv->port_count; k++) + { + mqnic_deactivate_port(priv, priv->ports[k]); + } + // deactivate TX queues for (k = 0; k < priv->tx_queue_count; k++) { diff --git a/modules/mqnic/mqnic_port.c b/modules/mqnic/mqnic_port.c index 61954698d..148e77628 100644 --- a/modules/mqnic/mqnic_port.c +++ b/modules/mqnic/mqnic_port.c @@ -37,7 +37,6 @@ int mqnic_create_port(struct mqnic_priv *priv, struct mqnic_port **port_ptr, int { struct device *dev = priv->dev; struct mqnic_port *port; - int k; port = kzalloc(sizeof(*port), GFP_KERNEL); if (!port) @@ -46,6 +45,8 @@ int mqnic_create_port(struct mqnic_priv *priv, struct mqnic_port **port_ptr, int return -ENOMEM; } + *port_ptr = port; + port->dev = dev; port->ndev = priv->ndev; @@ -68,28 +69,13 @@ int mqnic_create_port(struct mqnic_priv *priv, struct mqnic_port **port_ptr, int port->sched_type = ioread32(port->hw_addr+MQNIC_PORT_REG_SCHED_TYPE); dev_info(dev, "Scheduler type: 0x%08x", port->sched_type); - // disable schedulers - iowrite32(0, port->hw_addr+MQNIC_PORT_REG_SCHED_ENABLE); - - // enable schedulers - iowrite32(0xffffffff, port->hw_addr+MQNIC_PORT_REG_SCHED_ENABLE); - - for (k = 0; k < priv->tx_queue_count; k++) - { - iowrite32(1, port->hw_addr+port->sched_offset+k*4); - } - - // scheduler queue enable - iowrite32(0xffffffff, port->hw_addr+port->sched_offset+0x0200); - // scheduler global enable - iowrite32(0xffffffff, port->hw_addr+port->sched_offset+0x0300); + mqnic_deactivate_port(priv, port); return 0; } void mqnic_destroy_port(struct mqnic_priv *priv, struct mqnic_port **port_ptr) { - struct device *dev = priv->dev; struct mqnic_port *port = *port_ptr; *port_ptr = NULL; @@ -100,9 +86,21 @@ void mqnic_destroy_port(struct mqnic_priv *priv, struct mqnic_port **port_ptr) int mqnic_activate_port(struct mqnic_priv *priv, struct mqnic_port *port) { + int k; + // enable schedulers iowrite32(0xffffffff, port->hw_addr+MQNIC_PORT_REG_SCHED_ENABLE); + for (k = 0; k < priv->tx_queue_count; k++) + { + iowrite32(3, port->hw_addr+port->sched_offset+k*4); + } + + // scheduler queue enable + iowrite32(0xffffffff, port->hw_addr+port->sched_offset+0x0200); + // scheduler global enable + iowrite32(0xffffffff, port->hw_addr+port->sched_offset+0x0300); + return 0; }