1
0
mirror of https://github.com/corundum/corundum.git synced 2025-01-16 08:12:53 +08:00

Update port handling

This commit is contained in:
Alex Forencich 2019-11-01 16:34:14 -07:00
parent 381fd871c5
commit cf45a1b6fa
2 changed files with 24 additions and 17 deletions

View File

@ -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++)
{

View File

@ -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;
}