You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/davem/net
Pull networking fixes from David Miller:
1) Fix NBMA tunnel mac header handling in GRE, from Timo Teräs.
2) Fix a NAPI race in the fec driver, from Nimrod Andy.
3) The new IFF_VNET_LE bit is outside the size of the flags member it
is stored in (which is 16-bits), store the state locally in the
drivers. From Michael S Tsirkin.
4) We are kicking the tires with the new wireless maintainership
situation. Bluetooth fixes via Johan Hedberg, and mac80211 fixes
from Johannes Berg.
5) Fix locking and leaks in geneve driver, from Jesse Gross.
6) Make netlink TX mmap code always copy, so we don't have to be
potentially exposed to the user changing the underlying contents
from underneath us.
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (63 commits)
be2net: Fix incorrect setting of tunnel offload flag in netdev features
bnx2x: fix typos in "configure"
xen-netback: support frontends without feature-rx-notify again
MAINTAINERS: changes for wireless
cxgb4: Fix decoding QSA module for ethtool get settings
geneve: Fix races between socket add and release.
geneve: Remove socket and offload handlers at destruction.
netlink: Don't reorder loads/stores before marking mmap netlink frame as available
netlink: Always copy on mmap TX.
Bluetooth: Fix bug with filter in service discovery optimization
mac80211: free management frame keys when removing station
net: Disallow providing non zero VLAN ID for NIC drivers FDB add flow
net/mlx4: Cache line CQE/EQE stride fixes
net: fec: Fix NAPI race
xen-netfront: use napi_complete() correctly to prevent Rx stalling
ip_tunnel: Add missing validation of encap type to ip_tunnel_encap_setup()
ip_tunnel: Add sanity checks to ip_tunnel_encap_add_ops()
net: Allow FIXED_PHY to be modular.
if_tun: drop broken IFF_VNET_LE
macvtap: drop broken IFF_VNET_LE
...
This commit is contained in:
@@ -73,8 +73,8 @@ trie_leaf_remove()
|
||||
|
||||
trie_rebalance()
|
||||
The key function for the dynamic trie after any change in the trie
|
||||
it is run to optimize and reorganize. Tt will walk the trie upwards
|
||||
towards the root from a given tnode, doing a resize() at each step
|
||||
it is run to optimize and reorganize. It will walk the trie upwards
|
||||
towards the root from a given tnode, doing a resize() at each step
|
||||
to implement level compression.
|
||||
|
||||
resize()
|
||||
|
||||
+8
-11
@@ -6610,19 +6610,8 @@ L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
NETWORKING [WIRELESS]
|
||||
M: "John W. Linville" <linville@tuxdriver.com>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
Q: http://patchwork.kernel.org/project/linux-wireless/list/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/linville/wireless.git
|
||||
S: Maintained
|
||||
F: net/mac80211/
|
||||
F: net/rfkill/
|
||||
F: net/wireless/
|
||||
F: include/net/ieee80211*
|
||||
F: include/linux/wireless.h
|
||||
F: include/uapi/linux/wireless.h
|
||||
F: include/net/iw_handler.h
|
||||
F: drivers/net/wireless/
|
||||
|
||||
NETWORKING DRIVERS
|
||||
L: netdev@vger.kernel.org
|
||||
@@ -6643,6 +6632,14 @@ F: include/linux/inetdevice.h
|
||||
F: include/uapi/linux/if_*
|
||||
F: include/uapi/linux/netdevice.h
|
||||
|
||||
NETWORKING DRIVERS (WIRELESS)
|
||||
M: Kalle Valo <kvalo@codeaurora.org>
|
||||
L: linux-wireless@vger.kernel.org
|
||||
Q: http://patchwork.kernel.org/project/linux-wireless/list/
|
||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/kvalo/wireless-drivers.git/
|
||||
S: Maintained
|
||||
F: drivers/net/wireless/
|
||||
|
||||
NETXEN (1/10) GbE SUPPORT
|
||||
M: Manish Chopra <manish.chopra@qlogic.com>
|
||||
M: Sony Chacko <sony.chacko@qlogic.com>
|
||||
|
||||
@@ -87,6 +87,7 @@ static const struct usb_device_id ath3k_table[] = {
|
||||
{ USB_DEVICE(0x04CA, 0x3007) },
|
||||
{ USB_DEVICE(0x04CA, 0x3008) },
|
||||
{ USB_DEVICE(0x04CA, 0x300b) },
|
||||
{ USB_DEVICE(0x04CA, 0x3010) },
|
||||
{ USB_DEVICE(0x0930, 0x0219) },
|
||||
{ USB_DEVICE(0x0930, 0x0220) },
|
||||
{ USB_DEVICE(0x0930, 0x0227) },
|
||||
@@ -140,6 +141,7 @@ static const struct usb_device_id ath3k_blist_tbl[] = {
|
||||
{ USB_DEVICE(0x04ca, 0x3007), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x04ca, 0x3010), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0930, 0x0220), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0930, 0x0227), .driver_info = BTUSB_ATH3012 },
|
||||
|
||||
@@ -167,6 +167,7 @@ static const struct usb_device_id blacklist_table[] = {
|
||||
{ USB_DEVICE(0x04ca, 0x3007), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x04ca, 0x3008), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x04ca, 0x300b), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x04ca, 0x3010), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0930, 0x0219), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0930, 0x0220), .driver_info = BTUSB_ATH3012 },
|
||||
{ USB_DEVICE(0x0930, 0x0227), .driver_info = BTUSB_ATH3012 },
|
||||
|
||||
@@ -59,7 +59,7 @@ config NET_DSA_BCM_SF2
|
||||
depends on HAS_IOMEM
|
||||
select NET_DSA
|
||||
select NET_DSA_TAG_BRCM
|
||||
select FIXED_PHY if NET_DSA_BCM_SF2=y
|
||||
select FIXED_PHY
|
||||
select BCM7XXX_PHY
|
||||
select MDIO_BCM_UNIMAC
|
||||
---help---
|
||||
|
||||
@@ -64,7 +64,7 @@ config BCMGENET
|
||||
tristate "Broadcom GENET internal MAC support"
|
||||
select MII
|
||||
select PHYLIB
|
||||
select FIXED_PHY if BCMGENET=y
|
||||
select FIXED_PHY
|
||||
select BCM7XXX_PHY
|
||||
help
|
||||
This driver supports the built-in Ethernet MACs found in the
|
||||
@@ -155,7 +155,7 @@ config SYSTEMPORT
|
||||
depends on OF
|
||||
select MII
|
||||
select PHYLIB
|
||||
select FIXED_PHY if SYSTEMPORT=y
|
||||
select FIXED_PHY
|
||||
help
|
||||
This driver supports the built-in Ethernet MACs found in the
|
||||
Broadcom BCM7xxx Set Top Box family chipset using an internal
|
||||
|
||||
@@ -13256,7 +13256,7 @@ static int bnx2x_ptp_adjfreq(struct ptp_clock_info *ptp, s32 ppb)
|
||||
return -EFAULT;
|
||||
}
|
||||
|
||||
DP(BNX2X_MSG_PTP, "Configrued val = %d, period = %d\n", best_val,
|
||||
DP(BNX2X_MSG_PTP, "Configured val = %d, period = %d\n", best_val,
|
||||
best_period);
|
||||
|
||||
return 0;
|
||||
@@ -14784,7 +14784,7 @@ static int bnx2x_hwtstamp_ioctl(struct bnx2x *bp, struct ifreq *ifr)
|
||||
-EFAULT : 0;
|
||||
}
|
||||
|
||||
/* Configrues HW for PTP */
|
||||
/* Configures HW for PTP */
|
||||
static int bnx2x_configure_ptp(struct bnx2x *bp)
|
||||
{
|
||||
int rc, port = BP_PORT(bp);
|
||||
|
||||
@@ -7549,7 +7549,7 @@ Theotherbitsarereservedandshouldbezero*/
|
||||
#define IGU_REG_SISR_MDPC_WOMASK_UPPER 0x05a6
|
||||
|
||||
#define IGU_REG_RESERVED_UPPER 0x05ff
|
||||
/* Fields of IGU PF CONFIGRATION REGISTER */
|
||||
/* Fields of IGU PF CONFIGURATION REGISTER */
|
||||
#define IGU_PF_CONF_FUNC_EN (0x1<<0) /* function enable */
|
||||
#define IGU_PF_CONF_MSI_MSIX_EN (0x1<<1) /* MSI/MSIX enable */
|
||||
#define IGU_PF_CONF_INT_LINE_EN (0x1<<2) /* INT enable */
|
||||
@@ -7557,7 +7557,7 @@ Theotherbitsarereservedandshouldbezero*/
|
||||
#define IGU_PF_CONF_SINGLE_ISR_EN (0x1<<4) /* single ISR mode enable */
|
||||
#define IGU_PF_CONF_SIMD_MODE (0x1<<5) /* simd all ones mode */
|
||||
|
||||
/* Fields of IGU VF CONFIGRATION REGISTER */
|
||||
/* Fields of IGU VF CONFIGURATION REGISTER */
|
||||
#define IGU_VF_CONF_FUNC_EN (0x1<<0) /* function enable */
|
||||
#define IGU_VF_CONF_MSI_MSIX_EN (0x1<<1) /* MSI/MSIX enable */
|
||||
#define IGU_VF_CONF_PARENT_MASK (0x3<<2) /* Parent PF */
|
||||
|
||||
@@ -2160,7 +2160,7 @@ static int __init macb_probe(struct platform_device *pdev)
|
||||
int err = -ENXIO;
|
||||
const char *mac;
|
||||
void __iomem *mem;
|
||||
unsigned int hw_q, queue_mask, q, num_queues, q_irq = 0;
|
||||
unsigned int hw_q, queue_mask, q, num_queues;
|
||||
struct clk *pclk, *hclk, *tx_clk;
|
||||
|
||||
regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
@@ -2235,11 +2235,11 @@ static int __init macb_probe(struct platform_device *pdev)
|
||||
* register mapping but we don't want to test the queue index then
|
||||
* compute the corresponding register offset at run time.
|
||||
*/
|
||||
for (hw_q = 0; hw_q < MACB_MAX_QUEUES; ++hw_q) {
|
||||
for (hw_q = 0, q = 0; hw_q < MACB_MAX_QUEUES; ++hw_q) {
|
||||
if (!(queue_mask & (1 << hw_q)))
|
||||
continue;
|
||||
|
||||
queue = &bp->queues[q_irq];
|
||||
queue = &bp->queues[q];
|
||||
queue->bp = bp;
|
||||
if (hw_q) {
|
||||
queue->ISR = GEM_ISR(hw_q - 1);
|
||||
@@ -2261,18 +2261,18 @@ static int __init macb_probe(struct platform_device *pdev)
|
||||
* must remove the optional gaps that could exist in the
|
||||
* hardware queue mask.
|
||||
*/
|
||||
queue->irq = platform_get_irq(pdev, q_irq);
|
||||
queue->irq = platform_get_irq(pdev, q);
|
||||
err = devm_request_irq(&pdev->dev, queue->irq, macb_interrupt,
|
||||
0, dev->name, queue);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev,
|
||||
"Unable to request IRQ %d (error %d)\n",
|
||||
queue->irq, err);
|
||||
goto err_out_free_irq;
|
||||
goto err_out_free_netdev;
|
||||
}
|
||||
|
||||
INIT_WORK(&queue->tx_error_task, macb_tx_error_task);
|
||||
q_irq++;
|
||||
q++;
|
||||
}
|
||||
dev->irq = bp->queues[0].irq;
|
||||
|
||||
@@ -2350,7 +2350,7 @@ static int __init macb_probe(struct platform_device *pdev)
|
||||
err = register_netdev(dev);
|
||||
if (err) {
|
||||
dev_err(&pdev->dev, "Cannot register net device, aborting.\n");
|
||||
goto err_out_free_irq;
|
||||
goto err_out_free_netdev;
|
||||
}
|
||||
|
||||
err = macb_mii_init(bp);
|
||||
@@ -2373,9 +2373,7 @@ static int __init macb_probe(struct platform_device *pdev)
|
||||
|
||||
err_out_unregister_netdev:
|
||||
unregister_netdev(dev);
|
||||
err_out_free_irq:
|
||||
for (q = 0, queue = bp->queues; q < q_irq; ++q, ++queue)
|
||||
devm_free_irq(&pdev->dev, queue->irq, queue);
|
||||
err_out_free_netdev:
|
||||
free_netdev(dev);
|
||||
err_out_disable_clocks:
|
||||
if (!IS_ERR(tx_clk))
|
||||
@@ -2392,8 +2390,6 @@ static int __exit macb_remove(struct platform_device *pdev)
|
||||
{
|
||||
struct net_device *dev;
|
||||
struct macb *bp;
|
||||
struct macb_queue *queue;
|
||||
unsigned int q;
|
||||
|
||||
dev = platform_get_drvdata(pdev);
|
||||
|
||||
@@ -2405,14 +2401,11 @@ static int __exit macb_remove(struct platform_device *pdev)
|
||||
kfree(bp->mii_bus->irq);
|
||||
mdiobus_free(bp->mii_bus);
|
||||
unregister_netdev(dev);
|
||||
queue = bp->queues;
|
||||
for (q = 0; q < bp->num_queues; ++q, ++queue)
|
||||
devm_free_irq(&pdev->dev, queue->irq, queue);
|
||||
free_netdev(dev);
|
||||
if (!IS_ERR(bp->tx_clk))
|
||||
clk_disable_unprepare(bp->tx_clk);
|
||||
clk_disable_unprepare(bp->hclk);
|
||||
clk_disable_unprepare(bp->pclk);
|
||||
free_netdev(dev);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
@@ -2376,7 +2376,7 @@ const char *t4_get_port_type_description(enum fw_port_type port_type)
|
||||
"KR/KX",
|
||||
"KR/KX/KX4",
|
||||
"R QSFP_10G",
|
||||
"",
|
||||
"R QSA",
|
||||
"R QSFP",
|
||||
"R BP40_BA",
|
||||
};
|
||||
|
||||
@@ -2470,8 +2470,8 @@ enum fw_port_type {
|
||||
FW_PORT_TYPE_BP_AP,
|
||||
FW_PORT_TYPE_BP4_AP,
|
||||
FW_PORT_TYPE_QSFP_10G,
|
||||
FW_PORT_TYPE_QSFP,
|
||||
FW_PORT_TYPE_QSA,
|
||||
FW_PORT_TYPE_QSFP,
|
||||
FW_PORT_TYPE_BP40_BA,
|
||||
|
||||
FW_PORT_TYPE_NONE = FW_PORT_CMD_PTYPE_M
|
||||
|
||||
@@ -60,6 +60,7 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/in.h>
|
||||
#include <linux/jiffies.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/string.h>
|
||||
@@ -238,13 +239,13 @@ writereg(struct net_device *dev, u16 regno, u16 value)
|
||||
static int __init
|
||||
wait_eeprom_ready(struct net_device *dev)
|
||||
{
|
||||
int timeout = jiffies;
|
||||
unsigned long timeout = jiffies;
|
||||
/* check to see if the EEPROM is ready,
|
||||
* a timeout is used just in case EEPROM is ready when
|
||||
* SI_BUSY in the PP_SelfST is clear
|
||||
*/
|
||||
while (readreg(dev, PP_SelfST) & SI_BUSY)
|
||||
if (jiffies - timeout >= 40)
|
||||
if (time_after_eq(jiffies, timeout + 40))
|
||||
return -1;
|
||||
return 0;
|
||||
}
|
||||
@@ -485,7 +486,7 @@ control_dc_dc(struct net_device *dev, int on_not_off)
|
||||
{
|
||||
struct net_local *lp = netdev_priv(dev);
|
||||
unsigned int selfcontrol;
|
||||
int timenow = jiffies;
|
||||
unsigned long timenow = jiffies;
|
||||
/* control the DC to DC convertor in the SelfControl register.
|
||||
* Note: This is hooked up to a general purpose pin, might not
|
||||
* always be a DC to DC convertor.
|
||||
@@ -499,7 +500,7 @@ control_dc_dc(struct net_device *dev, int on_not_off)
|
||||
writereg(dev, PP_SelfCTL, selfcontrol);
|
||||
|
||||
/* Wait for the DC/DC converter to power up - 500ms */
|
||||
while (jiffies - timenow < HZ)
|
||||
while (time_before(jiffies, timenow + HZ))
|
||||
;
|
||||
}
|
||||
|
||||
@@ -514,7 +515,7 @@ send_test_pkt(struct net_device *dev)
|
||||
0, 0, /* DSAP=0 & SSAP=0 fields */
|
||||
0xf3, 0 /* Control (Test Req + P bit set) */
|
||||
};
|
||||
long timenow = jiffies;
|
||||
unsigned long timenow = jiffies;
|
||||
|
||||
writereg(dev, PP_LineCTL, readreg(dev, PP_LineCTL) | SERIAL_TX_ON);
|
||||
|
||||
@@ -525,10 +526,10 @@ send_test_pkt(struct net_device *dev)
|
||||
iowrite16(ETH_ZLEN, lp->virt_addr + TX_LEN_PORT);
|
||||
|
||||
/* Test to see if the chip has allocated memory for the packet */
|
||||
while (jiffies - timenow < 5)
|
||||
while (time_before(jiffies, timenow + 5))
|
||||
if (readreg(dev, PP_BusST) & READY_FOR_TX_NOW)
|
||||
break;
|
||||
if (jiffies - timenow >= 5)
|
||||
if (time_after_eq(jiffies, timenow + 5))
|
||||
return 0; /* this shouldn't happen */
|
||||
|
||||
/* Write the contents of the packet */
|
||||
@@ -536,7 +537,7 @@ send_test_pkt(struct net_device *dev)
|
||||
|
||||
cs89_dbg(1, debug, "Sending test packet ");
|
||||
/* wait a couple of jiffies for packet to be received */
|
||||
for (timenow = jiffies; jiffies - timenow < 3;)
|
||||
for (timenow = jiffies; time_before(jiffies, timenow + 3);)
|
||||
;
|
||||
if ((readreg(dev, PP_TxEvent) & TX_SEND_OK_BITS) == TX_OK) {
|
||||
cs89_dbg(1, cont, "succeeded\n");
|
||||
@@ -556,7 +557,7 @@ static int
|
||||
detect_tp(struct net_device *dev)
|
||||
{
|
||||
struct net_local *lp = netdev_priv(dev);
|
||||
int timenow = jiffies;
|
||||
unsigned long timenow = jiffies;
|
||||
int fdx;
|
||||
|
||||
cs89_dbg(1, debug, "%s: Attempting TP\n", dev->name);
|
||||
@@ -574,7 +575,7 @@ detect_tp(struct net_device *dev)
|
||||
/* Delay for the hardware to work out if the TP cable is present
|
||||
* - 150ms
|
||||
*/
|
||||
for (timenow = jiffies; jiffies - timenow < 15;)
|
||||
for (timenow = jiffies; time_before(jiffies, timenow + 15);)
|
||||
;
|
||||
if ((readreg(dev, PP_LineST) & LINK_OK) == 0)
|
||||
return DETECTED_NONE;
|
||||
@@ -618,7 +619,7 @@ detect_tp(struct net_device *dev)
|
||||
if ((lp->auto_neg_cnf & AUTO_NEG_BITS) == AUTO_NEG_ENABLE) {
|
||||
pr_info("%s: negotiating duplex...\n", dev->name);
|
||||
while (readreg(dev, PP_AutoNegST) & AUTO_NEG_BUSY) {
|
||||
if (jiffies - timenow > 4000) {
|
||||
if (time_after(jiffies, timenow + 4000)) {
|
||||
pr_err("**** Full / half duplex auto-negotiation timed out ****\n");
|
||||
break;
|
||||
}
|
||||
@@ -1271,7 +1272,7 @@ static void __init reset_chip(struct net_device *dev)
|
||||
{
|
||||
#if !defined(CONFIG_MACH_MX31ADS)
|
||||
struct net_local *lp = netdev_priv(dev);
|
||||
int reset_start_time;
|
||||
unsigned long reset_start_time;
|
||||
|
||||
writereg(dev, PP_SelfCTL, readreg(dev, PP_SelfCTL) | POWER_ON_RESET);
|
||||
|
||||
@@ -1294,7 +1295,7 @@ static void __init reset_chip(struct net_device *dev)
|
||||
/* Wait until the chip is reset */
|
||||
reset_start_time = jiffies;
|
||||
while ((readreg(dev, PP_SelfST) & INIT_DONE) == 0 &&
|
||||
jiffies - reset_start_time < 2)
|
||||
time_before(jiffies, reset_start_time + 2))
|
||||
;
|
||||
#endif /* !CONFIG_MACH_MX31ADS */
|
||||
}
|
||||
|
||||
@@ -3138,6 +3138,7 @@ static void be_disable_vxlan_offloads(struct be_adapter *adapter)
|
||||
|
||||
netdev->hw_enc_features = 0;
|
||||
netdev->hw_features &= ~(NETIF_F_GSO_UDP_TUNNEL);
|
||||
netdev->features &= ~(NETIF_F_GSO_UDP_TUNNEL);
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -4429,6 +4430,7 @@ static void be_add_vxlan_port(struct net_device *netdev, sa_family_t sa_family,
|
||||
NETIF_F_TSO | NETIF_F_TSO6 |
|
||||
NETIF_F_GSO_UDP_TUNNEL;
|
||||
netdev->hw_features |= NETIF_F_GSO_UDP_TUNNEL;
|
||||
netdev->features |= NETIF_F_GSO_UDP_TUNNEL;
|
||||
|
||||
dev_info(dev, "Enabled VxLAN offloads for UDP port %d\n",
|
||||
be16_to_cpu(port));
|
||||
|
||||
@@ -1558,20 +1558,21 @@ fec_enet_interrupt(int irq, void *dev_id)
|
||||
{
|
||||
struct net_device *ndev = dev_id;
|
||||
struct fec_enet_private *fep = netdev_priv(ndev);
|
||||
const unsigned napi_mask = FEC_ENET_RXF | FEC_ENET_TXF;
|
||||
uint int_events;
|
||||
irqreturn_t ret = IRQ_NONE;
|
||||
|
||||
int_events = readl(fep->hwp + FEC_IEVENT);
|
||||
writel(int_events & ~napi_mask, fep->hwp + FEC_IEVENT);
|
||||
writel(int_events, fep->hwp + FEC_IEVENT);
|
||||
fec_enet_collect_events(fep, int_events);
|
||||
|
||||
if (int_events & napi_mask) {
|
||||
if (fep->work_tx || fep->work_rx) {
|
||||
ret = IRQ_HANDLED;
|
||||
|
||||
/* Disable the NAPI interrupts */
|
||||
writel(FEC_ENET_MII, fep->hwp + FEC_IMASK);
|
||||
napi_schedule(&fep->napi);
|
||||
if (napi_schedule_prep(&fep->napi)) {
|
||||
/* Disable the NAPI interrupts */
|
||||
writel(FEC_ENET_MII, fep->hwp + FEC_IMASK);
|
||||
__napi_schedule(&fep->napi);
|
||||
}
|
||||
}
|
||||
|
||||
if (int_events & FEC_ENET_MII) {
|
||||
@@ -1591,12 +1592,6 @@ static int fec_enet_rx_napi(struct napi_struct *napi, int budget)
|
||||
struct fec_enet_private *fep = netdev_priv(ndev);
|
||||
int pkts;
|
||||
|
||||
/*
|
||||
* Clear any pending transmit or receive interrupts before
|
||||
* processing the rings to avoid racing with the hardware.
|
||||
*/
|
||||
writel(FEC_ENET_RXF | FEC_ENET_TXF, fep->hwp + FEC_IEVENT);
|
||||
|
||||
pkts = fec_enet_rx(ndev, budget);
|
||||
|
||||
fec_enet_tx(ndev);
|
||||
|
||||
@@ -7549,6 +7549,11 @@ static int i40e_ndo_fdb_add(struct ndmsg *ndm, struct nlattr *tb[],
|
||||
if (!(pf->flags & I40E_FLAG_SRIOV_ENABLED))
|
||||
return -EOPNOTSUPP;
|
||||
|
||||
if (vid) {
|
||||
pr_info("%s: vlans aren't supported yet for dev_uc|mc_add()\n", dev->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Hardware does not support aging addresses so if a
|
||||
* ndm_state is given only allow permanent addresses
|
||||
*/
|
||||
|
||||
@@ -1569,8 +1569,15 @@ int mlx4_en_start_port(struct net_device *dev)
|
||||
mlx4_en_free_affinity_hint(priv, i);
|
||||
goto cq_err;
|
||||
}
|
||||
for (j = 0; j < cq->size; j++)
|
||||
cq->buf[j].owner_sr_opcode = MLX4_CQE_OWNER_MASK;
|
||||
|
||||
for (j = 0; j < cq->size; j++) {
|
||||
struct mlx4_cqe *cqe = NULL;
|
||||
|
||||
cqe = mlx4_en_get_cqe(cq->buf, j, priv->cqe_size) +
|
||||
priv->cqe_factor;
|
||||
cqe->owner_sr_opcode = MLX4_CQE_OWNER_MASK;
|
||||
}
|
||||
|
||||
err = mlx4_en_set_cq_moder(priv, cq);
|
||||
if (err) {
|
||||
en_err(priv, "Failed setting cq moderation parameters\n");
|
||||
|
||||
@@ -787,11 +787,8 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
||||
if ((1 << (field & 0x3f)) > (PAGE_SIZE / dev_cap->bf_reg_size))
|
||||
field = 3;
|
||||
dev_cap->bf_regs_per_page = 1 << (field & 0x3f);
|
||||
mlx4_dbg(dev, "BlueFlame available (reg size %d, regs/page %d)\n",
|
||||
dev_cap->bf_reg_size, dev_cap->bf_regs_per_page);
|
||||
} else {
|
||||
dev_cap->bf_reg_size = 0;
|
||||
mlx4_dbg(dev, "BlueFlame not available\n");
|
||||
}
|
||||
|
||||
MLX4_GET(field, outbox, QUERY_DEV_CAP_MAX_SG_SQ_OFFSET);
|
||||
@@ -902,9 +899,6 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
||||
goto out;
|
||||
}
|
||||
|
||||
mlx4_dbg(dev, "Base MM extensions: flags %08x, rsvd L_Key %08x\n",
|
||||
dev_cap->bmme_flags, dev_cap->reserved_lkey);
|
||||
|
||||
/*
|
||||
* Each UAR has 4 EQ doorbells; so if a UAR is reserved, then
|
||||
* we can't use any EQs whose doorbell falls on that page,
|
||||
@@ -916,6 +910,21 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
||||
else
|
||||
dev_cap->flags2 |= MLX4_DEV_CAP_FLAG2_SYS_EQS;
|
||||
|
||||
out:
|
||||
mlx4_free_cmd_mailbox(dev, mailbox);
|
||||
return err;
|
||||
}
|
||||
|
||||
void mlx4_dev_cap_dump(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
||||
{
|
||||
if (dev_cap->bf_reg_size > 0)
|
||||
mlx4_dbg(dev, "BlueFlame available (reg size %d, regs/page %d)\n",
|
||||
dev_cap->bf_reg_size, dev_cap->bf_regs_per_page);
|
||||
else
|
||||
mlx4_dbg(dev, "BlueFlame not available\n");
|
||||
|
||||
mlx4_dbg(dev, "Base MM extensions: flags %08x, rsvd L_Key %08x\n",
|
||||
dev_cap->bmme_flags, dev_cap->reserved_lkey);
|
||||
mlx4_dbg(dev, "Max ICM size %lld MB\n",
|
||||
(unsigned long long) dev_cap->max_icm_sz >> 20);
|
||||
mlx4_dbg(dev, "Max QPs: %d, reserved QPs: %d, entry size: %d\n",
|
||||
@@ -949,13 +958,8 @@ int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
||||
dev_cap->dmfs_high_rate_qpn_base);
|
||||
mlx4_dbg(dev, "DMFS high rate steer QPn range: %d\n",
|
||||
dev_cap->dmfs_high_rate_qpn_range);
|
||||
|
||||
dump_dev_cap_flags(dev, dev_cap->flags);
|
||||
dump_dev_cap_flags2(dev, dev_cap->flags2);
|
||||
|
||||
out:
|
||||
mlx4_free_cmd_mailbox(dev, mailbox);
|
||||
return err;
|
||||
}
|
||||
|
||||
int mlx4_QUERY_PORT(struct mlx4_dev *dev, int port, struct mlx4_port_cap *port_cap)
|
||||
@@ -1848,8 +1852,8 @@ int mlx4_QUERY_HCA(struct mlx4_dev *dev,
|
||||
/* CX3 is capable of extending CQEs\EQEs to strides larger than 64B */
|
||||
MLX4_GET(byte_field, outbox, INIT_HCA_EQE_CQE_STRIDE_OFFSET);
|
||||
if (byte_field) {
|
||||
param->dev_cap_enabled |= MLX4_DEV_CAP_64B_EQE_ENABLED;
|
||||
param->dev_cap_enabled |= MLX4_DEV_CAP_64B_CQE_ENABLED;
|
||||
param->dev_cap_enabled |= MLX4_DEV_CAP_EQE_STRIDE_ENABLED;
|
||||
param->dev_cap_enabled |= MLX4_DEV_CAP_CQE_STRIDE_ENABLED;
|
||||
param->cqe_size = 1 << ((byte_field &
|
||||
MLX4_CQE_SIZE_MASK_STRIDE) + 5);
|
||||
param->eqe_size = 1 << (((byte_field &
|
||||
|
||||
@@ -224,6 +224,7 @@ struct mlx4_set_ib_param {
|
||||
u32 cap_mask;
|
||||
};
|
||||
|
||||
void mlx4_dev_cap_dump(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap);
|
||||
int mlx4_QUERY_DEV_CAP(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap);
|
||||
int mlx4_QUERY_PORT(struct mlx4_dev *dev, int port, struct mlx4_port_cap *port_cap);
|
||||
int mlx4_QUERY_FUNC_CAP(struct mlx4_dev *dev, u8 gen_or_port,
|
||||
|
||||
@@ -305,6 +305,7 @@ static int mlx4_dev_cap(struct mlx4_dev *dev, struct mlx4_dev_cap *dev_cap)
|
||||
mlx4_err(dev, "QUERY_DEV_CAP command failed, aborting\n");
|
||||
return err;
|
||||
}
|
||||
mlx4_dev_cap_dump(dev, dev_cap);
|
||||
|
||||
if (dev_cap->min_page_sz > PAGE_SIZE) {
|
||||
mlx4_err(dev, "HCA minimum page size of %d bigger than kernel PAGE_SIZE of %ld, aborting\n",
|
||||
@@ -2488,41 +2489,42 @@ static u64 mlx4_enable_sriov(struct mlx4_dev *dev, struct pci_dev *pdev,
|
||||
u8 total_vfs, int existing_vfs)
|
||||
{
|
||||
u64 dev_flags = dev->flags;
|
||||
int err = 0;
|
||||
|
||||
dev->dev_vfs = kzalloc(
|
||||
total_vfs * sizeof(*dev->dev_vfs),
|
||||
GFP_KERNEL);
|
||||
atomic_inc(&pf_loading);
|
||||
if (dev->flags & MLX4_FLAG_SRIOV) {
|
||||
if (existing_vfs != total_vfs) {
|
||||
mlx4_err(dev, "SR-IOV was already enabled, but with num_vfs (%d) different than requested (%d)\n",
|
||||
existing_vfs, total_vfs);
|
||||
total_vfs = existing_vfs;
|
||||
}
|
||||
}
|
||||
|
||||
dev->dev_vfs = kzalloc(total_vfs * sizeof(*dev->dev_vfs), GFP_KERNEL);
|
||||
if (NULL == dev->dev_vfs) {
|
||||
mlx4_err(dev, "Failed to allocate memory for VFs\n");
|
||||
goto disable_sriov;
|
||||
} else if (!(dev->flags & MLX4_FLAG_SRIOV)) {
|
||||
int err = 0;
|
||||
}
|
||||
|
||||
atomic_inc(&pf_loading);
|
||||
if (existing_vfs) {
|
||||
if (existing_vfs != total_vfs)
|
||||
mlx4_err(dev, "SR-IOV was already enabled, but with num_vfs (%d) different than requested (%d)\n",
|
||||
existing_vfs, total_vfs);
|
||||
} else {
|
||||
mlx4_warn(dev, "Enabling SR-IOV with %d VFs\n", total_vfs);
|
||||
err = pci_enable_sriov(pdev, total_vfs);
|
||||
}
|
||||
if (err) {
|
||||
mlx4_err(dev, "Failed to enable SR-IOV, continuing without SR-IOV (err = %d)\n",
|
||||
err);
|
||||
atomic_dec(&pf_loading);
|
||||
goto disable_sriov;
|
||||
} else {
|
||||
mlx4_warn(dev, "Running in master mode\n");
|
||||
dev_flags |= MLX4_FLAG_SRIOV |
|
||||
MLX4_FLAG_MASTER;
|
||||
dev_flags &= ~MLX4_FLAG_SLAVE;
|
||||
dev->num_vfs = total_vfs;
|
||||
}
|
||||
if (!(dev->flags & MLX4_FLAG_SRIOV)) {
|
||||
mlx4_warn(dev, "Enabling SR-IOV with %d VFs\n", total_vfs);
|
||||
err = pci_enable_sriov(pdev, total_vfs);
|
||||
}
|
||||
if (err) {
|
||||
mlx4_err(dev, "Failed to enable SR-IOV, continuing without SR-IOV (err = %d)\n",
|
||||
err);
|
||||
goto disable_sriov;
|
||||
} else {
|
||||
mlx4_warn(dev, "Running in master mode\n");
|
||||
dev_flags |= MLX4_FLAG_SRIOV |
|
||||
MLX4_FLAG_MASTER;
|
||||
dev_flags &= ~MLX4_FLAG_SLAVE;
|
||||
dev->num_vfs = total_vfs;
|
||||
}
|
||||
return dev_flags;
|
||||
|
||||
disable_sriov:
|
||||
atomic_dec(&pf_loading);
|
||||
dev->num_vfs = 0;
|
||||
kfree(dev->dev_vfs);
|
||||
return dev_flags & ~MLX4_FLAG_MASTER;
|
||||
@@ -2606,8 +2608,10 @@ static int mlx4_load_one(struct pci_dev *pdev, int pci_dev_data,
|
||||
}
|
||||
|
||||
if (total_vfs) {
|
||||
existing_vfs = pci_num_vf(pdev);
|
||||
dev->flags = MLX4_FLAG_MASTER;
|
||||
existing_vfs = pci_num_vf(pdev);
|
||||
if (existing_vfs)
|
||||
dev->flags |= MLX4_FLAG_SRIOV;
|
||||
dev->num_vfs = total_vfs;
|
||||
}
|
||||
}
|
||||
@@ -2643,6 +2647,7 @@ slave_start:
|
||||
}
|
||||
|
||||
if (mlx4_is_master(dev)) {
|
||||
/* when we hit the goto slave_start below, dev_cap already initialized */
|
||||
if (!dev_cap) {
|
||||
dev_cap = kzalloc(sizeof(*dev_cap), GFP_KERNEL);
|
||||
|
||||
@@ -2849,6 +2854,7 @@ slave_start:
|
||||
if (mlx4_is_master(dev) && dev->num_vfs)
|
||||
atomic_dec(&pf_loading);
|
||||
|
||||
kfree(dev_cap);
|
||||
return 0;
|
||||
|
||||
err_port:
|
||||
|
||||
@@ -39,7 +39,7 @@ config SMC91X
|
||||
select CRC32
|
||||
select MII
|
||||
depends on (ARM || M32R || SUPERH || MIPS || BLACKFIN || \
|
||||
MN10300 || COLDFIRE || ARM64 || XTENSA || NIOS2)
|
||||
MN10300 || COLDFIRE || ARM64 || XTENSA || NIOS2) && (!OF || GPIOLIB)
|
||||
---help---
|
||||
This is a driver for SMC's 91x series of Ethernet chipsets,
|
||||
including the SMC91C94 and the SMC91C111. Say Y if you want it
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user