From 4e121961ede66340504f250035286a5522fd2372 Mon Sep 17 00:00:00 2001 From: Stefan Assmann Date: Sat, 18 Aug 2012 04:06:11 +0000 Subject: [PATCH] --- yaml --- r: 328043 b: refs/heads/master c: f557147c4615f5e03abb673bd566901783565666 h: refs/heads/master i: 328041: 38d3f6765ea3177bb660f81b907a3dc009e07ab9 328039: 99da5a79137b629405952285525a6529dd34f5ab v: v3 --- [refs] | 2 +- .../devicetree/bindings/net/can/c_can.txt | 49 ------- trunk/drivers/net/can/c_can/c_can.c | 127 +----------------- trunk/drivers/net/can/c_can/c_can.h | 14 +- trunk/drivers/net/can/c_can/c_can_pci.c | 6 +- trunk/drivers/net/can/c_can/c_can_platform.c | 123 +++-------------- trunk/drivers/net/can/mscan/mpc5xxx_can.c | 4 +- trunk/drivers/net/can/sja1000/sja1000.c | 31 +---- .../net/can/usb/peak_usb/pcan_usb_core.c | 8 +- .../net/can/usb/peak_usb/pcan_usb_core.h | 2 +- .../net/can/usb/peak_usb/pcan_usb_pro.c | 8 +- trunk/drivers/net/ethernet/intel/igb/igb.h | 1 - .../drivers/net/ethernet/intel/igb/igb_main.c | 104 +++----------- 13 files changed, 63 insertions(+), 416 deletions(-) delete mode 100644 trunk/Documentation/devicetree/bindings/net/can/c_can.txt diff --git a/[refs] b/[refs] index a779252ac684..850f50e780b6 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 7146b2d9f11e07848050f53b71bafa37a95ae609 +refs/heads/master: f557147c4615f5e03abb673bd566901783565666 diff --git a/trunk/Documentation/devicetree/bindings/net/can/c_can.txt b/trunk/Documentation/devicetree/bindings/net/can/c_can.txt deleted file mode 100644 index 8f1ae81228e3..000000000000 --- a/trunk/Documentation/devicetree/bindings/net/can/c_can.txt +++ /dev/null @@ -1,49 +0,0 @@ -Bosch C_CAN/D_CAN controller Device Tree Bindings -------------------------------------------------- - -Required properties: -- compatible : Should be "bosch,c_can" for C_CAN controllers and - "bosch,d_can" for D_CAN controllers. -- reg : physical base address and size of the C_CAN/D_CAN - registers map -- interrupts : property with a value describing the interrupt - number - -Optional properties: -- ti,hwmods : Must be "d_can" or "c_can", n being the - instance number - -Note: "ti,hwmods" field is used to fetch the base address and irq -resources from TI, omap hwmod data base during device registration. -Future plan is to migrate hwmod data base contents into device tree -blob so that, all the required data will be used from device tree dts -file. - -Example: - -Step1: SoC common .dtsi file - - dcan1: d_can@481d0000 { - compatible = "bosch,d_can"; - reg = <0x481d0000 0x2000>; - interrupts = <55>; - interrupt-parent = <&intc>; - status = "disabled"; - }; - -(or) - - dcan1: d_can@481d0000 { - compatible = "bosch,d_can"; - ti,hwmods = "d_can1"; - reg = <0x481d0000 0x2000>; - interrupts = <55>; - interrupt-parent = <&intc>; - status = "disabled"; - }; - -Step 2: board specific .dts file - - &dcan1 { - status = "okay"; - }; diff --git a/trunk/drivers/net/can/c_can/c_can.c b/trunk/drivers/net/can/c_can/c_can.c index 2c4a21f98442..4c538e388655 100644 --- a/trunk/drivers/net/can/c_can/c_can.c +++ b/trunk/drivers/net/can/c_can/c_can.c @@ -34,7 +34,6 @@ #include #include #include -#include #include #include @@ -46,9 +45,6 @@ #define IF_ENUM_REG_LEN 11 #define C_CAN_IFACE(reg, iface) (C_CAN_IF1_##reg + (iface) * IF_ENUM_REG_LEN) -/* control extension register D_CAN specific */ -#define CONTROL_EX_PDR BIT(8) - /* control register */ #define CONTROL_TEST BIT(7) #define CONTROL_CCE BIT(6) @@ -68,7 +64,6 @@ #define TEST_BASIC BIT(2) /* status register */ -#define STATUS_PDA BIT(10) #define STATUS_BOFF BIT(7) #define STATUS_EWARN BIT(6) #define STATUS_EPASS BIT(5) @@ -168,9 +163,6 @@ /* minimum timeout for checking BUSY status */ #define MIN_TIMEOUT_VALUE 6 -/* Wait for ~1 sec for INIT bit */ -#define INIT_WAIT_MS 1000 - /* napi related */ #define C_CAN_NAPI_WEIGHT C_CAN_MSG_OBJ_RX_NUM @@ -209,30 +201,6 @@ static const struct can_bittiming_const c_can_bittiming_const = { .brp_inc = 1, }; -static inline void c_can_pm_runtime_enable(const struct c_can_priv *priv) -{ - if (priv->device) - pm_runtime_enable(priv->device); -} - -static inline void c_can_pm_runtime_disable(const struct c_can_priv *priv) -{ - if (priv->device) - pm_runtime_disable(priv->device); -} - -static inline void c_can_pm_runtime_get_sync(const struct c_can_priv *priv) -{ - if (priv->device) - pm_runtime_get_sync(priv->device); -} - -static inline void c_can_pm_runtime_put_sync(const struct c_can_priv *priv) -{ - if (priv->device) - pm_runtime_put_sync(priv->device); -} - static inline int get_tx_next_msg_obj(const struct c_can_priv *priv) { return (priv->tx_next & C_CAN_NEXT_MSG_OBJ_MASK) + @@ -705,15 +673,11 @@ static int c_can_get_berr_counter(const struct net_device *dev, unsigned int reg_err_counter; struct c_can_priv *priv = netdev_priv(dev); - c_can_pm_runtime_get_sync(priv); - reg_err_counter = priv->read_reg(priv, C_CAN_ERR_CNT_REG); bec->rxerr = (reg_err_counter & ERR_CNT_REC_MASK) >> ERR_CNT_REC_SHIFT; bec->txerr = reg_err_counter & ERR_CNT_TEC_MASK; - c_can_pm_runtime_put_sync(priv); - return 0; } @@ -1089,13 +1053,11 @@ static int c_can_open(struct net_device *dev) int err; struct c_can_priv *priv = netdev_priv(dev); - c_can_pm_runtime_get_sync(priv); - /* open the can device */ err = open_candev(dev); if (err) { netdev_err(dev, "failed to open can device\n"); - goto exit_open_fail; + return err; } /* register interrupt handler */ @@ -1117,8 +1079,6 @@ static int c_can_open(struct net_device *dev) exit_irq_fail: close_candev(dev); -exit_open_fail: - c_can_pm_runtime_put_sync(priv); return err; } @@ -1131,7 +1091,6 @@ static int c_can_close(struct net_device *dev) c_can_stop(dev); free_irq(dev->irq, dev); close_candev(dev); - c_can_pm_runtime_put_sync(priv); return 0; } @@ -1160,77 +1119,6 @@ struct net_device *alloc_c_can_dev(void) } EXPORT_SYMBOL_GPL(alloc_c_can_dev); -#ifdef CONFIG_PM -int c_can_power_down(struct net_device *dev) -{ - u32 val; - unsigned long time_out; - struct c_can_priv *priv = netdev_priv(dev); - - if (!(dev->flags & IFF_UP)) - return 0; - - WARN_ON(priv->type != BOSCH_D_CAN); - - /* set PDR value so the device goes to power down mode */ - val = priv->read_reg(priv, C_CAN_CTRL_EX_REG); - val |= CONTROL_EX_PDR; - priv->write_reg(priv, C_CAN_CTRL_EX_REG, val); - - /* Wait for the PDA bit to get set */ - time_out = jiffies + msecs_to_jiffies(INIT_WAIT_MS); - while (!(priv->read_reg(priv, C_CAN_STS_REG) & STATUS_PDA) && - time_after(time_out, jiffies)) - cpu_relax(); - - if (time_after(jiffies, time_out)) - return -ETIMEDOUT; - - c_can_stop(dev); - - c_can_pm_runtime_put_sync(priv); - - return 0; -} -EXPORT_SYMBOL_GPL(c_can_power_down); - -int c_can_power_up(struct net_device *dev) -{ - u32 val; - unsigned long time_out; - struct c_can_priv *priv = netdev_priv(dev); - - if (!(dev->flags & IFF_UP)) - return 0; - - WARN_ON(priv->type != BOSCH_D_CAN); - - c_can_pm_runtime_get_sync(priv); - - /* Clear PDR and INIT bits */ - val = priv->read_reg(priv, C_CAN_CTRL_EX_REG); - val &= ~CONTROL_EX_PDR; - priv->write_reg(priv, C_CAN_CTRL_EX_REG, val); - val = priv->read_reg(priv, C_CAN_CTRL_REG); - val &= ~CONTROL_INIT; - priv->write_reg(priv, C_CAN_CTRL_REG, val); - - /* Wait for the PDA bit to get clear */ - time_out = jiffies + msecs_to_jiffies(INIT_WAIT_MS); - while ((priv->read_reg(priv, C_CAN_STS_REG) & STATUS_PDA) && - time_after(time_out, jiffies)) - cpu_relax(); - - if (time_after(jiffies, time_out)) - return -ETIMEDOUT; - - c_can_start(dev); - - return 0; -} -EXPORT_SYMBOL_GPL(c_can_power_up); -#endif - void free_c_can_dev(struct net_device *dev) { free_candev(dev); @@ -1245,19 +1133,10 @@ static const struct net_device_ops c_can_netdev_ops = { int register_c_can_dev(struct net_device *dev) { - struct c_can_priv *priv = netdev_priv(dev); - int err; - - c_can_pm_runtime_enable(priv); - dev->flags |= IFF_ECHO; /* we support local echo */ dev->netdev_ops = &c_can_netdev_ops; - err = register_candev(dev); - if (err) - c_can_pm_runtime_disable(priv); - - return err; + return register_candev(dev); } EXPORT_SYMBOL_GPL(register_c_can_dev); @@ -1269,8 +1148,6 @@ void unregister_c_can_dev(struct net_device *dev) c_can_enable_all_interrupts(priv, DISABLE_ALL_INTERRUPTS); unregister_candev(dev); - - c_can_pm_runtime_disable(priv); } EXPORT_SYMBOL_GPL(unregister_c_can_dev); diff --git a/trunk/drivers/net/can/c_can/c_can.h b/trunk/drivers/net/can/c_can/c_can.h index e5ed41dafa1b..01a7049ab990 100644 --- a/trunk/drivers/net/can/c_can/c_can.h +++ b/trunk/drivers/net/can/c_can/c_can.h @@ -24,7 +24,6 @@ enum reg { C_CAN_CTRL_REG = 0, - C_CAN_CTRL_EX_REG, C_CAN_STS_REG, C_CAN_ERR_CNT_REG, C_CAN_BTR_REG, @@ -105,7 +104,6 @@ static const u16 reg_map_c_can[] = { static const u16 reg_map_d_can[] = { [C_CAN_CTRL_REG] = 0x00, - [C_CAN_CTRL_EX_REG] = 0x02, [C_CAN_STS_REG] = 0x04, [C_CAN_ERR_CNT_REG] = 0x08, [C_CAN_BTR_REG] = 0x0C, @@ -145,9 +143,8 @@ static const u16 reg_map_d_can[] = { }; enum c_can_dev_id { - BOSCH_C_CAN_PLATFORM, - BOSCH_C_CAN, - BOSCH_D_CAN, + C_CAN_DEVTYPE, + D_CAN_DEVTYPE, }; /* c_can private data structure */ @@ -155,7 +152,6 @@ struct c_can_priv { struct can_priv can; /* must be the first member */ struct napi_struct napi; struct net_device *dev; - struct device *device; int tx_object; int current_status; int last_status; @@ -168,7 +164,6 @@ struct c_can_priv { unsigned int tx_echo; void *priv; /* for board-specific data */ u16 irqstatus; - enum c_can_dev_id type; }; struct net_device *alloc_c_can_dev(void); @@ -176,9 +171,4 @@ void free_c_can_dev(struct net_device *dev); int register_c_can_dev(struct net_device *dev); void unregister_c_can_dev(struct net_device *dev); -#ifdef CONFIG_PM -int c_can_power_up(struct net_device *dev); -int c_can_power_down(struct net_device *dev); -#endif - #endif /* C_CAN_H */ diff --git a/trunk/drivers/net/can/c_can/c_can_pci.c b/trunk/drivers/net/can/c_can/c_can_pci.c index 3d7830bcd2bf..1011146ea513 100644 --- a/trunk/drivers/net/can/c_can/c_can_pci.c +++ b/trunk/drivers/net/can/c_can/c_can_pci.c @@ -120,10 +120,10 @@ static int __devinit c_can_pci_probe(struct pci_dev *pdev, /* Configure CAN type */ switch (c_can_pci_data->type) { - case BOSCH_C_CAN: + case C_CAN_DEVTYPE: priv->regs = reg_map_c_can; break; - case BOSCH_D_CAN: + case D_CAN_DEVTYPE: priv->regs = reg_map_d_can; priv->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES; break; @@ -192,7 +192,7 @@ static void __devexit c_can_pci_remove(struct pci_dev *pdev) } static struct c_can_pci_data c_can_sta2x11= { - .type = BOSCH_C_CAN, + .type = C_CAN_DEVTYPE, .reg_align = C_CAN_REG_ALIGN_32, .freq = 52000000, /* 52 Mhz */ }; diff --git a/trunk/drivers/net/can/c_can/c_can_platform.c b/trunk/drivers/net/can/c_can/c_can_platform.c index ee1416132aba..6ff7ad006c30 100644 --- a/trunk/drivers/net/can/c_can/c_can_platform.c +++ b/trunk/drivers/net/can/c_can/c_can_platform.c @@ -30,9 +30,6 @@ #include #include #include -#include -#include -#include #include @@ -68,58 +65,17 @@ static void c_can_plat_write_reg_aligned_to_32bit(struct c_can_priv *priv, writew(val, priv->base + 2 * priv->regs[index]); } -static struct platform_device_id c_can_id_table[] = { - [BOSCH_C_CAN_PLATFORM] = { - .name = KBUILD_MODNAME, - .driver_data = BOSCH_C_CAN, - }, - [BOSCH_C_CAN] = { - .name = "c_can", - .driver_data = BOSCH_C_CAN, - }, - [BOSCH_D_CAN] = { - .name = "d_can", - .driver_data = BOSCH_D_CAN, - }, { - } -}; - -static const struct of_device_id c_can_of_table[] = { - { .compatible = "bosch,c_can", .data = &c_can_id_table[BOSCH_C_CAN] }, - { .compatible = "bosch,d_can", .data = &c_can_id_table[BOSCH_D_CAN] }, - { /* sentinel */ }, -}; - static int __devinit c_can_plat_probe(struct platform_device *pdev) { int ret; void __iomem *addr; struct net_device *dev; struct c_can_priv *priv; - const struct of_device_id *match; const struct platform_device_id *id; - struct pinctrl *pinctrl; struct resource *mem; int irq; struct clk *clk; - if (pdev->dev.of_node) { - match = of_match_device(c_can_of_table, &pdev->dev); - if (!match) { - dev_err(&pdev->dev, "Failed to find matching dt id\n"); - ret = -EINVAL; - goto exit; - } - id = match->data; - } else { - id = platform_get_device_id(pdev); - } - - pinctrl = devm_pinctrl_get_select_default(&pdev->dev); - if (IS_ERR(pinctrl)) - dev_warn(&pdev->dev, - "failed to configure pins from driver\n"); - /* get the appropriate clk */ clk = clk_get(&pdev->dev, NULL); if (IS_ERR(clk)) { @@ -158,8 +114,9 @@ static int __devinit c_can_plat_probe(struct platform_device *pdev) } priv = netdev_priv(dev); + id = platform_get_device_id(pdev); switch (id->driver_data) { - case BOSCH_C_CAN: + case C_CAN_DEVTYPE: priv->regs = reg_map_c_can; switch (mem->flags & IORESOURCE_MEM_TYPE_MASK) { case IORESOURCE_MEM_32BIT: @@ -173,7 +130,7 @@ static int __devinit c_can_plat_probe(struct platform_device *pdev) break; } break; - case BOSCH_D_CAN: + case D_CAN_DEVTYPE: priv->regs = reg_map_d_can; priv->can.ctrlmode_supported |= CAN_CTRLMODE_3_SAMPLES; priv->read_reg = c_can_plat_read_reg_aligned_to_16bit; @@ -186,10 +143,8 @@ static int __devinit c_can_plat_probe(struct platform_device *pdev) dev->irq = irq; priv->base = addr; - priv->device = &pdev->dev; priv->can.clock.freq = clk_get_rate(clk); priv->priv = clk; - priv->type = id->driver_data; platform_set_drvdata(pdev, dev); SET_NETDEV_DEV(dev, &pdev->dev); @@ -240,75 +195,27 @@ static int __devexit c_can_plat_remove(struct platform_device *pdev) return 0; } -#ifdef CONFIG_PM -static int c_can_suspend(struct platform_device *pdev, pm_message_t state) -{ - int ret; - struct net_device *ndev = platform_get_drvdata(pdev); - struct c_can_priv *priv = netdev_priv(ndev); - - if (priv->type != BOSCH_D_CAN) { - dev_warn(&pdev->dev, "Not supported\n"); - return 0; - } - - if (netif_running(ndev)) { - netif_stop_queue(ndev); - netif_device_detach(ndev); - } - - ret = c_can_power_down(ndev); - if (ret) { - netdev_err(ndev, "failed to enter power down mode\n"); - return ret; - } - - priv->can.state = CAN_STATE_SLEEPING; - - return 0; -} - -static int c_can_resume(struct platform_device *pdev) -{ - int ret; - struct net_device *ndev = platform_get_drvdata(pdev); - struct c_can_priv *priv = netdev_priv(ndev); - - if (priv->type != BOSCH_D_CAN) { - dev_warn(&pdev->dev, "Not supported\n"); - return 0; - } - - ret = c_can_power_up(ndev); - if (ret) { - netdev_err(ndev, "Still in power down mode\n"); - return ret; - } - - priv->can.state = CAN_STATE_ERROR_ACTIVE; - - if (netif_running(ndev)) { - netif_device_attach(ndev); - netif_start_queue(ndev); +static const struct platform_device_id c_can_id_table[] = { + { + .name = KBUILD_MODNAME, + .driver_data = C_CAN_DEVTYPE, + }, { + .name = "c_can", + .driver_data = C_CAN_DEVTYPE, + }, { + .name = "d_can", + .driver_data = D_CAN_DEVTYPE, + }, { } - - return 0; -} -#else -#define c_can_suspend NULL -#define c_can_resume NULL -#endif +}; static struct platform_driver c_can_plat_driver = { .driver = { .name = KBUILD_MODNAME, .owner = THIS_MODULE, - .of_match_table = of_match_ptr(c_can_of_table), }, .probe = c_can_plat_probe, .remove = __devexit_p(c_can_plat_remove), - .suspend = c_can_suspend, - .resume = c_can_resume, .id_table = c_can_id_table, }; diff --git a/trunk/drivers/net/can/mscan/mpc5xxx_can.c b/trunk/drivers/net/can/mscan/mpc5xxx_can.c index 524ef96dc24d..06adf881ea24 100644 --- a/trunk/drivers/net/can/mscan/mpc5xxx_can.c +++ b/trunk/drivers/net/can/mscan/mpc5xxx_can.c @@ -181,7 +181,7 @@ static u32 __devinit mpc512x_can_get_clock(struct platform_device *ofdev, if (!clock_name || !strcmp(clock_name, "sys")) { sys_clk = clk_get(&ofdev->dev, "sys_clk"); - if (IS_ERR(sys_clk)) { + if (!sys_clk) { dev_err(&ofdev->dev, "couldn't get sys_clk\n"); goto exit_unmap; } @@ -204,7 +204,7 @@ static u32 __devinit mpc512x_can_get_clock(struct platform_device *ofdev, if (clocksrc < 0) { ref_clk = clk_get(&ofdev->dev, "ref_clk"); - if (IS_ERR(ref_clk)) { + if (!ref_clk) { dev_err(&ofdev->dev, "couldn't get ref_clk\n"); goto exit_unmap; } diff --git a/trunk/drivers/net/can/sja1000/sja1000.c b/trunk/drivers/net/can/sja1000/sja1000.c index 25011dbe1b96..4c4f33d482d2 100644 --- a/trunk/drivers/net/can/sja1000/sja1000.c +++ b/trunk/drivers/net/can/sja1000/sja1000.c @@ -156,13 +156,8 @@ static void set_normal_mode(struct net_device *dev) } /* set chip to normal mode */ - if (priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY) - priv->write_reg(priv, REG_MOD, MOD_LOM); - else - priv->write_reg(priv, REG_MOD, 0x00); - + priv->write_reg(priv, REG_MOD, 0x00); udelay(10); - status = priv->read_reg(priv, REG_MOD); } @@ -315,10 +310,7 @@ static netdev_tx_t sja1000_start_xmit(struct sk_buff *skb, can_put_echo_skb(skb, dev, 0); - if (priv->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT) - sja1000_write_cmdreg(priv, CMD_TR | CMD_AT); - else - sja1000_write_cmdreg(priv, CMD_TR); + sja1000_write_cmdreg(priv, CMD_TR); return NETDEV_TX_OK; } @@ -513,18 +505,10 @@ irqreturn_t sja1000_interrupt(int irq, void *dev_id) netdev_warn(dev, "wakeup interrupt\n"); if (isrc & IRQ_TI) { - /* transmission buffer released */ - if (priv->can.ctrlmode & CAN_CTRLMODE_ONE_SHOT && - !(status & SR_TCS)) { - stats->tx_errors++; - can_free_echo_skb(dev, 0); - } else { - /* transmission complete */ - stats->tx_bytes += - priv->read_reg(priv, REG_FI) & 0xf; - stats->tx_packets++; - can_get_echo_skb(dev, 0); - } + /* transmission complete interrupt */ + stats->tx_bytes += priv->read_reg(priv, REG_FI) & 0xf; + stats->tx_packets++; + can_get_echo_skb(dev, 0); netif_wake_queue(dev); } if (isrc & IRQ_RI) { @@ -621,8 +605,7 @@ struct net_device *alloc_sja1000dev(int sizeof_priv) priv->can.do_set_mode = sja1000_set_mode; priv->can.do_get_berr_counter = sja1000_get_berr_counter; priv->can.ctrlmode_supported = CAN_CTRLMODE_3_SAMPLES | - CAN_CTRLMODE_BERR_REPORTING | CAN_CTRLMODE_LISTENONLY | - CAN_CTRLMODE_ONE_SHOT; + CAN_CTRLMODE_BERR_REPORTING; spin_lock_init(&priv->cmdreg_lock); diff --git a/trunk/drivers/net/can/usb/peak_usb/pcan_usb_core.c b/trunk/drivers/net/can/usb/peak_usb/pcan_usb_core.c index c4643c400d46..d2f91f737871 100644 --- a/trunk/drivers/net/can/usb/peak_usb/pcan_usb_core.c +++ b/trunk/drivers/net/can/usb/peak_usb/pcan_usb_core.c @@ -53,7 +53,7 @@ static struct peak_usb_adapter *peak_usb_adapters_list[] = { * dump memory */ #define DUMP_WIDTH 16 -void pcan_dump_mem(char *prompt, void *p, int l) +void dump_mem(char *prompt, void *p, int l) { pr_info("%s dumping %s (%d bytes):\n", PCAN_USB_DRIVER_NAME, prompt ? prompt : "memory", l); @@ -203,9 +203,9 @@ static void peak_usb_read_bulk_callback(struct urb *urb) if (dev->state & PCAN_USB_STATE_STARTED) { err = dev->adapter->dev_decode_buf(dev, urb); if (err) - pcan_dump_mem("received usb message", - urb->transfer_buffer, - urb->transfer_buffer_length); + dump_mem("received usb message", + urb->transfer_buffer, + urb->transfer_buffer_length); } } diff --git a/trunk/drivers/net/can/usb/peak_usb/pcan_usb_core.h b/trunk/drivers/net/can/usb/peak_usb/pcan_usb_core.h index c8e5e91d7cb5..4c775b620be2 100644 --- a/trunk/drivers/net/can/usb/peak_usb/pcan_usb_core.h +++ b/trunk/drivers/net/can/usb/peak_usb/pcan_usb_core.h @@ -131,7 +131,7 @@ struct peak_usb_device { struct peak_usb_device *next_siblings; }; -void pcan_dump_mem(char *prompt, void *p, int l); +void dump_mem(char *prompt, void *p, int l); /* common timestamp management */ void peak_usb_init_time_ref(struct peak_time_ref *time_ref, diff --git a/trunk/drivers/net/can/usb/peak_usb/pcan_usb_pro.c b/trunk/drivers/net/can/usb/peak_usb/pcan_usb_pro.c index e1626d92511a..629c4ba5d49d 100644 --- a/trunk/drivers/net/can/usb/peak_usb/pcan_usb_pro.c +++ b/trunk/drivers/net/can/usb/peak_usb/pcan_usb_pro.c @@ -292,8 +292,8 @@ static int pcan_usb_pro_wait_rsp(struct peak_usb_device *dev, if (!rec_len) { netdev_err(dev->netdev, "got unprocessed record in msg\n"); - pcan_dump_mem("rcvd rsp msg", pum->u.rec_buffer, - actual_length); + dump_mem("rcvd rsp msg", pum->u.rec_buffer, + actual_length); break; } @@ -756,8 +756,8 @@ static int pcan_usb_pro_decode_buf(struct peak_usb_device *dev, struct urb *urb) fail: if (err) - pcan_dump_mem("received msg", - urb->transfer_buffer, urb->actual_length); + dump_mem("received msg", + urb->transfer_buffer, urb->actual_length); return err; } diff --git a/trunk/drivers/net/ethernet/intel/igb/igb.h b/trunk/drivers/net/ethernet/intel/igb/igb.h index 43c8e2914263..6f17f698fafe 100644 --- a/trunk/drivers/net/ethernet/intel/igb/igb.h +++ b/trunk/drivers/net/ethernet/intel/igb/igb.h @@ -101,7 +101,6 @@ struct vf_data_storage { u16 pf_vlan; /* When set, guest VLAN config not allowed. */ u16 pf_qos; u16 tx_rate; - struct pci_dev *vfdev; }; #define IGB_VF_FLAG_CTS 0x00000001 /* VF is clear to send data */ diff --git a/trunk/drivers/net/ethernet/intel/igb/igb_main.c b/trunk/drivers/net/ethernet/intel/igb/igb_main.c index 246646b61a1a..073009671e7a 100644 --- a/trunk/drivers/net/ethernet/intel/igb/igb_main.c +++ b/trunk/drivers/net/ethernet/intel/igb/igb_main.c @@ -172,8 +172,7 @@ static void igb_check_vf_rate_limit(struct igb_adapter *); #ifdef CONFIG_PCI_IOV static int igb_vf_configure(struct igb_adapter *adapter, int vf); -static int igb_find_enabled_vfs(struct igb_adapter *adapter); -static int igb_check_vf_assignment(struct igb_adapter *adapter); +static bool igb_vfs_are_assigned(struct igb_adapter *adapter); #endif #ifdef CONFIG_PM @@ -2300,11 +2299,11 @@ static void __devexit igb_remove(struct pci_dev *pdev) /* reclaim resources allocated to VFs */ if (adapter->vf_data) { /* disable iov and allow time for transactions to clear */ - if (!igb_check_vf_assignment(adapter)) { + if (igb_vfs_are_assigned(adapter)) { + dev_info(&pdev->dev, "Unloading driver while VFs are assigned - VFs will not be deallocated\n"); + } else { pci_disable_sriov(pdev); msleep(500); - } else { - dev_info(&pdev->dev, "VF(s) assigned to guests!\n"); } kfree(adapter->vf_data); @@ -2344,7 +2343,7 @@ static void __devinit igb_probe_vfs(struct igb_adapter * adapter) #ifdef CONFIG_PCI_IOV struct pci_dev *pdev = adapter->pdev; struct e1000_hw *hw = &adapter->hw; - int old_vfs = igb_find_enabled_vfs(adapter); + int old_vfs = pci_num_vf(adapter->pdev); int i; /* Virtualization features not supported on i210 family. */ @@ -5037,102 +5036,43 @@ static int igb_notify_dca(struct notifier_block *nb, unsigned long event, static int igb_vf_configure(struct igb_adapter *adapter, int vf) { unsigned char mac_addr[ETH_ALEN]; - struct pci_dev *pdev = adapter->pdev; - struct e1000_hw *hw = &adapter->hw; - struct pci_dev *pvfdev; - unsigned int device_id; - u16 thisvf_devfn; eth_random_addr(mac_addr); igb_set_vf_mac(adapter, vf, mac_addr); - switch (adapter->hw.mac.type) { - case e1000_82576: - device_id = IGB_82576_VF_DEV_ID; - /* VF Stride for 82576 is 2 */ - thisvf_devfn = (pdev->devfn + 0x80 + (vf << 1)) | - (pdev->devfn & 1); - break; - case e1000_i350: - device_id = IGB_I350_VF_DEV_ID; - /* VF Stride for I350 is 4 */ - thisvf_devfn = (pdev->devfn + 0x80 + (vf << 2)) | - (pdev->devfn & 3); - break; - default: - device_id = 0; - thisvf_devfn = 0; - break; - } - - pvfdev = pci_get_device(hw->vendor_id, device_id, NULL); - while (pvfdev) { - if (pvfdev->devfn == thisvf_devfn) - break; - pvfdev = pci_get_device(hw->vendor_id, - device_id, pvfdev); - } - - if (pvfdev) - adapter->vf_data[vf].vfdev = pvfdev; - else - dev_err(&pdev->dev, - "Couldn't find pci dev ptr for VF %4.4x\n", - thisvf_devfn); - return pvfdev != NULL; + return 0; } -static int igb_find_enabled_vfs(struct igb_adapter *adapter) +static bool igb_vfs_are_assigned(struct igb_adapter *adapter) { - struct e1000_hw *hw = &adapter->hw; struct pci_dev *pdev = adapter->pdev; - struct pci_dev *pvfdev; - u16 vf_devfn = 0; - u16 vf_stride; - unsigned int device_id; - int vfs_found = 0; + struct pci_dev *vfdev; + int dev_id; switch (adapter->hw.mac.type) { case e1000_82576: - device_id = IGB_82576_VF_DEV_ID; - /* VF Stride for 82576 is 2 */ - vf_stride = 2; + dev_id = IGB_82576_VF_DEV_ID; break; case e1000_i350: - device_id = IGB_I350_VF_DEV_ID; - /* VF Stride for I350 is 4 */ - vf_stride = 4; + dev_id = IGB_I350_VF_DEV_ID; break; default: - device_id = 0; - vf_stride = 0; - break; - } - - vf_devfn = pdev->devfn + 0x80; - pvfdev = pci_get_device(hw->vendor_id, device_id, NULL); - while (pvfdev) { - if (pvfdev->devfn == vf_devfn && - (pvfdev->bus->number >= pdev->bus->number)) - vfs_found++; - vf_devfn += vf_stride; - pvfdev = pci_get_device(hw->vendor_id, - device_id, pvfdev); + return false; } - return vfs_found; -} - -static int igb_check_vf_assignment(struct igb_adapter *adapter) -{ - int i; - for (i = 0; i < adapter->vfs_allocated_count; i++) { - if (adapter->vf_data[i].vfdev) { - if (adapter->vf_data[i].vfdev->dev_flags & - PCI_DEV_FLAGS_ASSIGNED) + /* loop through all the VFs to see if we own any that are assigned */ + vfdev = pci_get_device(PCI_VENDOR_ID_INTEL, dev_id, NULL); + while (vfdev) { + /* if we don't own it we don't care */ + if (vfdev->is_virtfn && vfdev->physfn == pdev) { + /* if it is assigned we cannot release it */ + if (vfdev->dev_flags & PCI_DEV_FLAGS_ASSIGNED) return true; } + + vfdev = pci_get_device(PCI_VENDOR_ID_INTEL, dev_id, vfdev); } + return false; }