Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/davem/net-2.6
Conflicts: drivers/net/netxen/netxen_nic_main.c
This commit is contained in:
@@ -515,7 +515,7 @@ rx_status_loop:
|
|||||||
dma_addr_t mapping;
|
dma_addr_t mapping;
|
||||||
struct sk_buff *skb, *new_skb;
|
struct sk_buff *skb, *new_skb;
|
||||||
struct cp_desc *desc;
|
struct cp_desc *desc;
|
||||||
unsigned buflen;
|
const unsigned buflen = cp->rx_buf_sz;
|
||||||
|
|
||||||
skb = cp->rx_skb[rx_tail];
|
skb = cp->rx_skb[rx_tail];
|
||||||
BUG_ON(!skb);
|
BUG_ON(!skb);
|
||||||
@@ -549,8 +549,7 @@ rx_status_loop:
|
|||||||
pr_debug("%s: rx slot %d status 0x%x len %d\n",
|
pr_debug("%s: rx slot %d status 0x%x len %d\n",
|
||||||
dev->name, rx_tail, status, len);
|
dev->name, rx_tail, status, len);
|
||||||
|
|
||||||
buflen = cp->rx_buf_sz + NET_IP_ALIGN;
|
new_skb = netdev_alloc_skb(dev, buflen + NET_IP_ALIGN);
|
||||||
new_skb = netdev_alloc_skb(dev, buflen);
|
|
||||||
if (!new_skb) {
|
if (!new_skb) {
|
||||||
dev->stats.rx_dropped++;
|
dev->stats.rx_dropped++;
|
||||||
goto rx_next;
|
goto rx_next;
|
||||||
|
@@ -611,11 +611,18 @@ nla_put_failure:
|
|||||||
return -EMSGSIZE;
|
return -EMSGSIZE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int can_newlink(struct net_device *dev,
|
||||||
|
struct nlattr *tb[], struct nlattr *data[])
|
||||||
|
{
|
||||||
|
return -EOPNOTSUPP;
|
||||||
|
}
|
||||||
|
|
||||||
static struct rtnl_link_ops can_link_ops __read_mostly = {
|
static struct rtnl_link_ops can_link_ops __read_mostly = {
|
||||||
.kind = "can",
|
.kind = "can",
|
||||||
.maxtype = IFLA_CAN_MAX,
|
.maxtype = IFLA_CAN_MAX,
|
||||||
.policy = can_policy,
|
.policy = can_policy,
|
||||||
.setup = can_setup,
|
.setup = can_setup,
|
||||||
|
.newlink = can_newlink,
|
||||||
.changelink = can_changelink,
|
.changelink = can_changelink,
|
||||||
.fill_info = can_fill_info,
|
.fill_info = can_fill_info,
|
||||||
.fill_xstats = can_fill_xstats,
|
.fill_xstats = can_fill_xstats,
|
||||||
|
@@ -1953,6 +1953,7 @@ static int ixgbe_set_coalesce(struct net_device *netdev,
|
|||||||
struct ethtool_coalesce *ec)
|
struct ethtool_coalesce *ec)
|
||||||
{
|
{
|
||||||
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
struct ixgbe_adapter *adapter = netdev_priv(netdev);
|
||||||
|
struct ixgbe_q_vector *q_vector;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (ec->tx_max_coalesced_frames_irq)
|
if (ec->tx_max_coalesced_frames_irq)
|
||||||
@@ -1987,8 +1988,12 @@ static int ixgbe_set_coalesce(struct net_device *netdev,
|
|||||||
adapter->itr_setting = 0;
|
adapter->itr_setting = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < adapter->num_msix_vectors - NON_Q_VECTORS; i++) {
|
/* MSI/MSIx Interrupt Mode */
|
||||||
struct ixgbe_q_vector *q_vector = adapter->q_vector[i];
|
if (adapter->flags &
|
||||||
|
(IXGBE_FLAG_MSIX_ENABLED | IXGBE_FLAG_MSI_ENABLED)) {
|
||||||
|
int num_vectors = adapter->num_msix_vectors - NON_Q_VECTORS;
|
||||||
|
for (i = 0; i < num_vectors; i++) {
|
||||||
|
q_vector = adapter->q_vector[i];
|
||||||
if (q_vector->txr_count && !q_vector->rxr_count)
|
if (q_vector->txr_count && !q_vector->rxr_count)
|
||||||
/* tx vector gets half the rate */
|
/* tx vector gets half the rate */
|
||||||
q_vector->eitr = (adapter->eitr_param >> 1);
|
q_vector->eitr = (adapter->eitr_param >> 1);
|
||||||
@@ -1997,6 +2002,12 @@ static int ixgbe_set_coalesce(struct net_device *netdev,
|
|||||||
q_vector->eitr = adapter->eitr_param;
|
q_vector->eitr = adapter->eitr_param;
|
||||||
ixgbe_write_eitr(q_vector);
|
ixgbe_write_eitr(q_vector);
|
||||||
}
|
}
|
||||||
|
/* Legacy Interrupt Mode */
|
||||||
|
} else {
|
||||||
|
q_vector = adapter->q_vector[0];
|
||||||
|
q_vector->eitr = adapter->eitr_param;
|
||||||
|
ixgbe_write_eitr(q_vector);
|
||||||
|
}
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@@ -1112,7 +1112,7 @@ struct netxen_adapter {
|
|||||||
u8 mc_enabled;
|
u8 mc_enabled;
|
||||||
u8 max_mc_count;
|
u8 max_mc_count;
|
||||||
u8 rss_supported;
|
u8 rss_supported;
|
||||||
u8 resv2;
|
u8 link_changed;
|
||||||
u32 resv3;
|
u32 resv3;
|
||||||
|
|
||||||
u8 has_link_events;
|
u8 has_link_events;
|
||||||
|
@@ -184,13 +184,6 @@ void netxen_free_sw_resources(struct netxen_adapter *adapter)
|
|||||||
kfree(recv_ctx->rds_rings);
|
kfree(recv_ctx->rds_rings);
|
||||||
|
|
||||||
skip_rds:
|
skip_rds:
|
||||||
if (recv_ctx->sds_rings == NULL)
|
|
||||||
goto skip_sds;
|
|
||||||
|
|
||||||
for(ring = 0; ring < adapter->max_sds_rings; ring++)
|
|
||||||
recv_ctx->sds_rings[ring].consumer = 0;
|
|
||||||
|
|
||||||
skip_sds:
|
|
||||||
if (adapter->tx_ring == NULL)
|
if (adapter->tx_ring == NULL)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
@@ -95,10 +95,6 @@ static struct pci_device_id netxen_pci_tbl[] __devinitdata = {
|
|||||||
|
|
||||||
MODULE_DEVICE_TABLE(pci, netxen_pci_tbl);
|
MODULE_DEVICE_TABLE(pci, netxen_pci_tbl);
|
||||||
|
|
||||||
static struct workqueue_struct *netxen_workq;
|
|
||||||
#define SCHEDULE_WORK(tp) queue_work(netxen_workq, tp)
|
|
||||||
#define FLUSH_SCHEDULED_WORK() flush_workqueue(netxen_workq)
|
|
||||||
|
|
||||||
static void netxen_watchdog(unsigned long);
|
static void netxen_watchdog(unsigned long);
|
||||||
|
|
||||||
static uint32_t crb_cmd_producer[4] = {
|
static uint32_t crb_cmd_producer[4] = {
|
||||||
@@ -172,6 +168,8 @@ netxen_free_sds_rings(struct netxen_recv_context *recv_ctx)
|
|||||||
{
|
{
|
||||||
if (recv_ctx->sds_rings != NULL)
|
if (recv_ctx->sds_rings != NULL)
|
||||||
kfree(recv_ctx->sds_rings);
|
kfree(recv_ctx->sds_rings);
|
||||||
|
|
||||||
|
recv_ctx->sds_rings = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
@@ -193,6 +191,21 @@ netxen_napi_add(struct netxen_adapter *adapter, struct net_device *netdev)
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
netxen_napi_del(struct netxen_adapter *adapter)
|
||||||
|
{
|
||||||
|
int ring;
|
||||||
|
struct nx_host_sds_ring *sds_ring;
|
||||||
|
struct netxen_recv_context *recv_ctx = &adapter->recv_ctx;
|
||||||
|
|
||||||
|
for (ring = 0; ring < adapter->max_sds_rings; ring++) {
|
||||||
|
sds_ring = &recv_ctx->sds_rings[ring];
|
||||||
|
netif_napi_del(&sds_ring->napi);
|
||||||
|
}
|
||||||
|
|
||||||
|
netxen_free_sds_rings(&adapter->recv_ctx);
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
netxen_napi_enable(struct netxen_adapter *adapter)
|
netxen_napi_enable(struct netxen_adapter *adapter)
|
||||||
{
|
{
|
||||||
@@ -910,7 +923,6 @@ netxen_nic_down(struct netxen_adapter *adapter, struct net_device *netdev)
|
|||||||
spin_unlock(&adapter->tx_clean_lock);
|
spin_unlock(&adapter->tx_clean_lock);
|
||||||
|
|
||||||
del_timer_sync(&adapter->watchdog_timer);
|
del_timer_sync(&adapter->watchdog_timer);
|
||||||
FLUSH_SCHEDULED_WORK();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -927,10 +939,12 @@ netxen_nic_attach(struct netxen_adapter *adapter)
|
|||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
err = netxen_init_firmware(adapter);
|
err = netxen_init_firmware(adapter);
|
||||||
if (err != 0) {
|
if (err)
|
||||||
printk(KERN_ERR "Failed to init firmware\n");
|
return err;
|
||||||
return -EIO;
|
|
||||||
}
|
err = netxen_napi_add(adapter, netdev);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
err = netxen_alloc_sw_resources(adapter);
|
err = netxen_alloc_sw_resources(adapter);
|
||||||
if (err) {
|
if (err) {
|
||||||
@@ -995,6 +1009,7 @@ netxen_nic_detach(struct netxen_adapter *adapter)
|
|||||||
netxen_free_hw_resources(adapter);
|
netxen_free_hw_resources(adapter);
|
||||||
netxen_release_rx_buffers(adapter);
|
netxen_release_rx_buffers(adapter);
|
||||||
netxen_nic_free_irq(adapter);
|
netxen_nic_free_irq(adapter);
|
||||||
|
netxen_napi_del(adapter);
|
||||||
netxen_free_sw_resources(adapter);
|
netxen_free_sw_resources(adapter);
|
||||||
|
|
||||||
adapter->is_up = 0;
|
adapter->is_up = 0;
|
||||||
@@ -1245,13 +1260,15 @@ static void __devexit netxen_nic_remove(struct pci_dev *pdev)
|
|||||||
|
|
||||||
unregister_netdev(netdev);
|
unregister_netdev(netdev);
|
||||||
|
|
||||||
|
cancel_work_sync(&adapter->watchdog_task);
|
||||||
|
cancel_work_sync(&adapter->tx_timeout_task);
|
||||||
|
|
||||||
netxen_nic_detach(adapter);
|
netxen_nic_detach(adapter);
|
||||||
|
|
||||||
if (adapter->portnum == 0)
|
if (adapter->portnum == 0)
|
||||||
netxen_free_dummy_dma(adapter);
|
netxen_free_dummy_dma(adapter);
|
||||||
|
|
||||||
netxen_teardown_intr(adapter);
|
netxen_teardown_intr(adapter);
|
||||||
netxen_free_sds_rings(&adapter->recv_ctx);
|
|
||||||
|
|
||||||
netxen_cleanup_pci_map(adapter);
|
netxen_cleanup_pci_map(adapter);
|
||||||
|
|
||||||
@@ -1277,6 +1294,9 @@ netxen_nic_suspend(struct pci_dev *pdev, pm_message_t state)
|
|||||||
if (netif_running(netdev))
|
if (netif_running(netdev))
|
||||||
netxen_nic_down(adapter, netdev);
|
netxen_nic_down(adapter, netdev);
|
||||||
|
|
||||||
|
cancel_work_sync(&adapter->watchdog_task);
|
||||||
|
cancel_work_sync(&adapter->tx_timeout_task);
|
||||||
|
|
||||||
netxen_nic_detach(adapter);
|
netxen_nic_detach(adapter);
|
||||||
|
|
||||||
pci_save_state(pdev);
|
pci_save_state(pdev);
|
||||||
@@ -1643,11 +1663,6 @@ static int netxen_nic_check_temp(struct netxen_adapter *adapter)
|
|||||||
"%s: Device temperature %d degrees C exceeds"
|
"%s: Device temperature %d degrees C exceeds"
|
||||||
" maximum allowed. Hardware has been shut down.\n",
|
" maximum allowed. Hardware has been shut down.\n",
|
||||||
netdev->name, temp_val);
|
netdev->name, temp_val);
|
||||||
|
|
||||||
netif_device_detach(netdev);
|
|
||||||
netxen_nic_down(adapter, netdev);
|
|
||||||
netxen_nic_detach(adapter);
|
|
||||||
|
|
||||||
rv = 1;
|
rv = 1;
|
||||||
} else if (temp_state == NX_TEMP_WARN) {
|
} else if (temp_state == NX_TEMP_WARN) {
|
||||||
if (adapter->temp == NX_TEMP_NORMAL) {
|
if (adapter->temp == NX_TEMP_NORMAL) {
|
||||||
@@ -1681,10 +1696,7 @@ void netxen_advert_link_change(struct netxen_adapter *adapter, int linkup)
|
|||||||
netif_carrier_off(netdev);
|
netif_carrier_off(netdev);
|
||||||
netif_stop_queue(netdev);
|
netif_stop_queue(netdev);
|
||||||
}
|
}
|
||||||
|
adapter->link_changed = !adapter->has_link_events;
|
||||||
if (!adapter->has_link_events)
|
|
||||||
netxen_nic_set_link_parameters(adapter);
|
|
||||||
|
|
||||||
} else if (!adapter->ahw.linkup && linkup) {
|
} else if (!adapter->ahw.linkup && linkup) {
|
||||||
printk(KERN_INFO "%s: %s NIC Link is up\n",
|
printk(KERN_INFO "%s: %s NIC Link is up\n",
|
||||||
netxen_nic_driver_name, netdev->name);
|
netxen_nic_driver_name, netdev->name);
|
||||||
@@ -1693,9 +1705,7 @@ void netxen_advert_link_change(struct netxen_adapter *adapter, int linkup)
|
|||||||
netif_carrier_on(netdev);
|
netif_carrier_on(netdev);
|
||||||
netif_wake_queue(netdev);
|
netif_wake_queue(netdev);
|
||||||
}
|
}
|
||||||
|
adapter->link_changed = !adapter->has_link_events;
|
||||||
if (!adapter->has_link_events)
|
|
||||||
netxen_nic_set_link_parameters(adapter);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1722,11 +1732,36 @@ static void netxen_nic_handle_phy_intr(struct netxen_adapter *adapter)
|
|||||||
netxen_advert_link_change(adapter, linkup);
|
netxen_advert_link_change(adapter, linkup);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void netxen_nic_thermal_shutdown(struct netxen_adapter *adapter)
|
||||||
|
{
|
||||||
|
struct net_device *netdev = adapter->netdev;
|
||||||
|
|
||||||
|
netif_device_detach(netdev);
|
||||||
|
netxen_nic_down(adapter, netdev);
|
||||||
|
netxen_nic_detach(adapter);
|
||||||
|
}
|
||||||
|
|
||||||
static void netxen_watchdog(unsigned long v)
|
static void netxen_watchdog(unsigned long v)
|
||||||
{
|
{
|
||||||
struct netxen_adapter *adapter = (struct netxen_adapter *)v;
|
struct netxen_adapter *adapter = (struct netxen_adapter *)v;
|
||||||
|
|
||||||
SCHEDULE_WORK(&adapter->watchdog_task);
|
if (netxen_nic_check_temp(adapter))
|
||||||
|
goto do_sched;
|
||||||
|
|
||||||
|
if (!adapter->has_link_events) {
|
||||||
|
netxen_nic_handle_phy_intr(adapter);
|
||||||
|
|
||||||
|
if (adapter->link_changed)
|
||||||
|
goto do_sched;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (netif_running(adapter->netdev))
|
||||||
|
mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ);
|
||||||
|
|
||||||
|
return;
|
||||||
|
|
||||||
|
do_sched:
|
||||||
|
schedule_work(&adapter->watchdog_task);
|
||||||
}
|
}
|
||||||
|
|
||||||
void netxen_watchdog_task(struct work_struct *work)
|
void netxen_watchdog_task(struct work_struct *work)
|
||||||
@@ -1734,11 +1769,13 @@ void netxen_watchdog_task(struct work_struct *work)
|
|||||||
struct netxen_adapter *adapter =
|
struct netxen_adapter *adapter =
|
||||||
container_of(work, struct netxen_adapter, watchdog_task);
|
container_of(work, struct netxen_adapter, watchdog_task);
|
||||||
|
|
||||||
if (netxen_nic_check_temp(adapter))
|
if (adapter->temp == NX_TEMP_PANIC) {
|
||||||
|
netxen_nic_thermal_shutdown(adapter);
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (!adapter->has_link_events)
|
if (adapter->link_changed)
|
||||||
netxen_nic_handle_phy_intr(adapter);
|
netxen_nic_set_link_parameters(adapter);
|
||||||
|
|
||||||
if (netif_running(adapter->netdev))
|
if (netif_running(adapter->netdev))
|
||||||
mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ);
|
mod_timer(&adapter->watchdog_timer, jiffies + 2 * HZ);
|
||||||
@@ -1746,12 +1783,10 @@ void netxen_watchdog_task(struct work_struct *work)
|
|||||||
|
|
||||||
static void netxen_tx_timeout(struct net_device *netdev)
|
static void netxen_tx_timeout(struct net_device *netdev)
|
||||||
{
|
{
|
||||||
struct netxen_adapter *adapter = (struct netxen_adapter *)
|
struct netxen_adapter *adapter = netdev_priv(netdev);
|
||||||
netdev_priv(netdev);
|
|
||||||
|
|
||||||
dev_err(&netdev->dev, "transmit timeout, resetting.\n");
|
dev_err(&netdev->dev, "transmit timeout, resetting.\n");
|
||||||
|
schedule_work(&adapter->tx_timeout_task);
|
||||||
SCHEDULE_WORK(&adapter->tx_timeout_task);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void netxen_reset_task(struct work_struct *work)
|
static void netxen_reset_task(struct work_struct *work)
|
||||||
@@ -2025,9 +2060,6 @@ static int __init netxen_init_module(void)
|
|||||||
{
|
{
|
||||||
printk(KERN_INFO "%s\n", netxen_nic_driver_string);
|
printk(KERN_INFO "%s\n", netxen_nic_driver_string);
|
||||||
|
|
||||||
if ((netxen_workq = create_singlethread_workqueue("netxen")) == NULL)
|
|
||||||
return -ENOMEM;
|
|
||||||
|
|
||||||
#ifdef CONFIG_INET
|
#ifdef CONFIG_INET
|
||||||
register_netdevice_notifier(&netxen_netdev_cb);
|
register_netdevice_notifier(&netxen_netdev_cb);
|
||||||
register_inetaddr_notifier(&netxen_inetaddr_cb);
|
register_inetaddr_notifier(&netxen_inetaddr_cb);
|
||||||
@@ -2046,7 +2078,6 @@ static void __exit netxen_exit_module(void)
|
|||||||
unregister_inetaddr_notifier(&netxen_inetaddr_cb);
|
unregister_inetaddr_notifier(&netxen_inetaddr_cb);
|
||||||
unregister_netdevice_notifier(&netxen_netdev_cb);
|
unregister_netdevice_notifier(&netxen_netdev_cb);
|
||||||
#endif
|
#endif
|
||||||
destroy_workqueue(netxen_workq);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
module_exit(netxen_exit_module);
|
module_exit(netxen_exit_module);
|
||||||
|
Reference in New Issue
Block a user