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 double-free in batman-adv, from Sven Eckelmann.
2) Fix packet stats for fast-RX path, from Joannes Berg.
3) Netfilter's ip_route_me_harder() doesn't handle request sockets
properly, fix from Florian Westphal.
4) Fix sendmsg deadlock in rxrpc, from David Howells.
5) Add missing RCU locking to transport hashtable scan, from Xin Long.
6) Fix potential packet loss in mlxsw driver, from Ido Schimmel.
7) Fix race in NAPI handling between poll handlers and busy polling,
from Eric Dumazet.
8) TX path in vxlan and geneve need proper RCU locking, from Jakub
Kicinski.
9) SYN processing in DCCP and TCP need to disable BH, from Eric
Dumazet.
10) Properly handle net_enable_timestamp() being invoked from IRQ
context, also from Eric Dumazet.
11) Fix crash on device-tree systems in xgene driver, from Alban Bedel.
12) Do not call sk_free() on a locked socket, from Arnaldo Carvalho de
Melo.
13) Fix use-after-free in netvsc driver, from Dexuan Cui.
14) Fix max MTU setting in bonding driver, from WANG Cong.
15) xen-netback hash table can be allocated from softirq context, so use
GFP_ATOMIC. From Anoob Soman.
16) Fix MAC address change bug in bgmac driver, from Hari Vyas.
17) strparser needs to destroy strp_wq on module exit, from WANG Cong.
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net: (69 commits)
strparser: destroy workqueue on module exit
sfc: fix IPID endianness in TSOv2
sfc: avoid max() in array size
rds: remove unnecessary returned value check
rxrpc: Fix potential NULL-pointer exception
nfp: correct DMA direction in XDP DMA sync
nfp: don't tell FW about the reserved buffer space
net: ethernet: bgmac: mac address change bug
net: ethernet: bgmac: init sequence bug
xen-netback: don't vfree() queues under spinlock
xen-netback: keep a local pointer for vif in backend_disconnect()
netfilter: nf_tables: don't call nfnetlink_set_err() if nfnetlink_send() fails
netfilter: nft_set_rbtree: incorrect assumption on lower interval lookups
netfilter: nf_conntrack_sip: fix wrong memory initialisation
can: flexcan: fix typo in comment
can: usb_8dev: Fix memory leak of priv->cmd_msg_buffer
can: gs_usb: fix coding style
can: gs_usb: Don't use stack memory for USB transfers
ixgbe: Limit use of 2K buffers on architectures with 256B or larger cache lines
ixgbe: update the rss key on h/w, when ethtool ask for it
...
This commit is contained in:
+2
-3
@@ -6011,9 +6011,8 @@ F: include/linux/hsi/
|
|||||||
F: include/uapi/linux/hsi/
|
F: include/uapi/linux/hsi/
|
||||||
|
|
||||||
HSO 3G MODEM DRIVER
|
HSO 3G MODEM DRIVER
|
||||||
M: Jan Dumon <j.dumon@option.com>
|
L: linux-usb@vger.kernel.org
|
||||||
W: http://www.pharscape.org
|
S: Orphan
|
||||||
S: Maintained
|
|
||||||
F: drivers/net/usb/hso.c
|
F: drivers/net/usb/hso.c
|
||||||
|
|
||||||
HSR NETWORK PROTOCOL
|
HSR NETWORK PROTOCOL
|
||||||
|
|||||||
@@ -4179,6 +4179,7 @@ void bond_setup(struct net_device *bond_dev)
|
|||||||
|
|
||||||
/* Initialize the device entry points */
|
/* Initialize the device entry points */
|
||||||
ether_setup(bond_dev);
|
ether_setup(bond_dev);
|
||||||
|
bond_dev->max_mtu = ETH_MAX_MTU;
|
||||||
bond_dev->netdev_ops = &bond_netdev_ops;
|
bond_dev->netdev_ops = &bond_netdev_ops;
|
||||||
bond_dev->ethtool_ops = &bond_ethtool_ops;
|
bond_dev->ethtool_ops = &bond_ethtool_ops;
|
||||||
|
|
||||||
|
|||||||
@@ -196,7 +196,7 @@
|
|||||||
#define FLEXCAN_QUIRK_BROKEN_ERR_STATE BIT(1) /* [TR]WRN_INT not connected */
|
#define FLEXCAN_QUIRK_BROKEN_ERR_STATE BIT(1) /* [TR]WRN_INT not connected */
|
||||||
#define FLEXCAN_QUIRK_DISABLE_RXFG BIT(2) /* Disable RX FIFO Global mask */
|
#define FLEXCAN_QUIRK_DISABLE_RXFG BIT(2) /* Disable RX FIFO Global mask */
|
||||||
#define FLEXCAN_QUIRK_ENABLE_EACEN_RRS BIT(3) /* Enable EACEN and RRS bit in ctrl2 */
|
#define FLEXCAN_QUIRK_ENABLE_EACEN_RRS BIT(3) /* Enable EACEN and RRS bit in ctrl2 */
|
||||||
#define FLEXCAN_QUIRK_DISABLE_MECR BIT(4) /* Disble Memory error detection */
|
#define FLEXCAN_QUIRK_DISABLE_MECR BIT(4) /* Disable Memory error detection */
|
||||||
#define FLEXCAN_QUIRK_USE_OFF_TIMESTAMP BIT(5) /* Use timestamp based offloading */
|
#define FLEXCAN_QUIRK_USE_OFF_TIMESTAMP BIT(5) /* Use timestamp based offloading */
|
||||||
|
|
||||||
/* Structure of the message buffer */
|
/* Structure of the message buffer */
|
||||||
|
|||||||
@@ -258,7 +258,7 @@ static int gs_cmd_reset(struct gs_usb *gsusb, struct gs_can *gsdev)
|
|||||||
rc = usb_control_msg(interface_to_usbdev(intf),
|
rc = usb_control_msg(interface_to_usbdev(intf),
|
||||||
usb_sndctrlpipe(interface_to_usbdev(intf), 0),
|
usb_sndctrlpipe(interface_to_usbdev(intf), 0),
|
||||||
GS_USB_BREQ_MODE,
|
GS_USB_BREQ_MODE,
|
||||||
USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_INTERFACE,
|
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
|
||||||
gsdev->channel,
|
gsdev->channel,
|
||||||
0,
|
0,
|
||||||
dm,
|
dm,
|
||||||
@@ -432,7 +432,7 @@ static int gs_usb_set_bittiming(struct net_device *netdev)
|
|||||||
rc = usb_control_msg(interface_to_usbdev(intf),
|
rc = usb_control_msg(interface_to_usbdev(intf),
|
||||||
usb_sndctrlpipe(interface_to_usbdev(intf), 0),
|
usb_sndctrlpipe(interface_to_usbdev(intf), 0),
|
||||||
GS_USB_BREQ_BITTIMING,
|
GS_USB_BREQ_BITTIMING,
|
||||||
USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_INTERFACE,
|
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
|
||||||
dev->channel,
|
dev->channel,
|
||||||
0,
|
0,
|
||||||
dbt,
|
dbt,
|
||||||
@@ -546,7 +546,6 @@ static netdev_tx_t gs_can_start_xmit(struct sk_buff *skb,
|
|||||||
hf,
|
hf,
|
||||||
urb->transfer_dma);
|
urb->transfer_dma);
|
||||||
|
|
||||||
|
|
||||||
if (rc == -ENODEV) {
|
if (rc == -ENODEV) {
|
||||||
netif_device_detach(netdev);
|
netif_device_detach(netdev);
|
||||||
} else {
|
} else {
|
||||||
@@ -804,7 +803,7 @@ static struct gs_can *gs_make_candev(unsigned int channel,
|
|||||||
rc = usb_control_msg(interface_to_usbdev(intf),
|
rc = usb_control_msg(interface_to_usbdev(intf),
|
||||||
usb_rcvctrlpipe(interface_to_usbdev(intf), 0),
|
usb_rcvctrlpipe(interface_to_usbdev(intf), 0),
|
||||||
GS_USB_BREQ_BT_CONST,
|
GS_USB_BREQ_BT_CONST,
|
||||||
USB_DIR_IN|USB_TYPE_VENDOR|USB_RECIP_INTERFACE,
|
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
|
||||||
channel,
|
channel,
|
||||||
0,
|
0,
|
||||||
bt_const,
|
bt_const,
|
||||||
@@ -908,57 +907,72 @@ static int gs_usb_probe(struct usb_interface *intf,
|
|||||||
struct gs_usb *dev;
|
struct gs_usb *dev;
|
||||||
int rc = -ENOMEM;
|
int rc = -ENOMEM;
|
||||||
unsigned int icount, i;
|
unsigned int icount, i;
|
||||||
struct gs_host_config hconf = {
|
struct gs_host_config *hconf;
|
||||||
.byte_order = 0x0000beef,
|
struct gs_device_config *dconf;
|
||||||
};
|
|
||||||
struct gs_device_config dconf;
|
hconf = kmalloc(sizeof(*hconf), GFP_KERNEL);
|
||||||
|
if (!hconf)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
|
hconf->byte_order = 0x0000beef;
|
||||||
|
|
||||||
/* send host config */
|
/* send host config */
|
||||||
rc = usb_control_msg(interface_to_usbdev(intf),
|
rc = usb_control_msg(interface_to_usbdev(intf),
|
||||||
usb_sndctrlpipe(interface_to_usbdev(intf), 0),
|
usb_sndctrlpipe(interface_to_usbdev(intf), 0),
|
||||||
GS_USB_BREQ_HOST_FORMAT,
|
GS_USB_BREQ_HOST_FORMAT,
|
||||||
USB_DIR_OUT|USB_TYPE_VENDOR|USB_RECIP_INTERFACE,
|
USB_DIR_OUT | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
|
||||||
1,
|
1,
|
||||||
intf->altsetting[0].desc.bInterfaceNumber,
|
intf->altsetting[0].desc.bInterfaceNumber,
|
||||||
&hconf,
|
hconf,
|
||||||
sizeof(hconf),
|
sizeof(*hconf),
|
||||||
1000);
|
1000);
|
||||||
|
|
||||||
|
kfree(hconf);
|
||||||
|
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
dev_err(&intf->dev, "Couldn't send data format (err=%d)\n",
|
dev_err(&intf->dev, "Couldn't send data format (err=%d)\n",
|
||||||
rc);
|
rc);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dconf = kmalloc(sizeof(*dconf), GFP_KERNEL);
|
||||||
|
if (!dconf)
|
||||||
|
return -ENOMEM;
|
||||||
|
|
||||||
/* read device config */
|
/* read device config */
|
||||||
rc = usb_control_msg(interface_to_usbdev(intf),
|
rc = usb_control_msg(interface_to_usbdev(intf),
|
||||||
usb_rcvctrlpipe(interface_to_usbdev(intf), 0),
|
usb_rcvctrlpipe(interface_to_usbdev(intf), 0),
|
||||||
GS_USB_BREQ_DEVICE_CONFIG,
|
GS_USB_BREQ_DEVICE_CONFIG,
|
||||||
USB_DIR_IN|USB_TYPE_VENDOR|USB_RECIP_INTERFACE,
|
USB_DIR_IN | USB_TYPE_VENDOR | USB_RECIP_INTERFACE,
|
||||||
1,
|
1,
|
||||||
intf->altsetting[0].desc.bInterfaceNumber,
|
intf->altsetting[0].desc.bInterfaceNumber,
|
||||||
&dconf,
|
dconf,
|
||||||
sizeof(dconf),
|
sizeof(*dconf),
|
||||||
1000);
|
1000);
|
||||||
if (rc < 0) {
|
if (rc < 0) {
|
||||||
dev_err(&intf->dev, "Couldn't get device config: (err=%d)\n",
|
dev_err(&intf->dev, "Couldn't get device config: (err=%d)\n",
|
||||||
rc);
|
rc);
|
||||||
|
kfree(dconf);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
|
|
||||||
icount = dconf.icount + 1;
|
icount = dconf->icount + 1;
|
||||||
dev_info(&intf->dev, "Configuring for %d interfaces\n", icount);
|
dev_info(&intf->dev, "Configuring for %d interfaces\n", icount);
|
||||||
|
|
||||||
if (icount > GS_MAX_INTF) {
|
if (icount > GS_MAX_INTF) {
|
||||||
dev_err(&intf->dev,
|
dev_err(&intf->dev,
|
||||||
"Driver cannot handle more that %d CAN interfaces\n",
|
"Driver cannot handle more that %d CAN interfaces\n",
|
||||||
GS_MAX_INTF);
|
GS_MAX_INTF);
|
||||||
|
kfree(dconf);
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
dev = kzalloc(sizeof(*dev), GFP_KERNEL);
|
||||||
if (!dev)
|
if (!dev) {
|
||||||
|
kfree(dconf);
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
init_usb_anchor(&dev->rx_submitted);
|
init_usb_anchor(&dev->rx_submitted);
|
||||||
|
|
||||||
atomic_set(&dev->active_channels, 0);
|
atomic_set(&dev->active_channels, 0);
|
||||||
@@ -967,7 +981,7 @@ static int gs_usb_probe(struct usb_interface *intf,
|
|||||||
dev->udev = interface_to_usbdev(intf);
|
dev->udev = interface_to_usbdev(intf);
|
||||||
|
|
||||||
for (i = 0; i < icount; i++) {
|
for (i = 0; i < icount; i++) {
|
||||||
dev->canch[i] = gs_make_candev(i, intf, &dconf);
|
dev->canch[i] = gs_make_candev(i, intf, dconf);
|
||||||
if (IS_ERR_OR_NULL(dev->canch[i])) {
|
if (IS_ERR_OR_NULL(dev->canch[i])) {
|
||||||
/* save error code to return later */
|
/* save error code to return later */
|
||||||
rc = PTR_ERR(dev->canch[i]);
|
rc = PTR_ERR(dev->canch[i]);
|
||||||
@@ -978,12 +992,15 @@ static int gs_usb_probe(struct usb_interface *intf,
|
|||||||
gs_destroy_candev(dev->canch[i]);
|
gs_destroy_candev(dev->canch[i]);
|
||||||
|
|
||||||
usb_kill_anchored_urbs(&dev->rx_submitted);
|
usb_kill_anchored_urbs(&dev->rx_submitted);
|
||||||
|
kfree(dconf);
|
||||||
kfree(dev);
|
kfree(dev);
|
||||||
return rc;
|
return rc;
|
||||||
}
|
}
|
||||||
dev->canch[i]->parent = dev;
|
dev->canch[i]->parent = dev;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
kfree(dconf);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -951,8 +951,8 @@ static int usb_8dev_probe(struct usb_interface *intf,
|
|||||||
for (i = 0; i < MAX_TX_URBS; i++)
|
for (i = 0; i < MAX_TX_URBS; i++)
|
||||||
priv->tx_contexts[i].echo_index = MAX_TX_URBS;
|
priv->tx_contexts[i].echo_index = MAX_TX_URBS;
|
||||||
|
|
||||||
priv->cmd_msg_buffer = kzalloc(sizeof(struct usb_8dev_cmd_msg),
|
priv->cmd_msg_buffer = devm_kzalloc(&intf->dev, sizeof(struct usb_8dev_cmd_msg),
|
||||||
GFP_KERNEL);
|
GFP_KERNEL);
|
||||||
if (!priv->cmd_msg_buffer)
|
if (!priv->cmd_msg_buffer)
|
||||||
goto cleanup_candev;
|
goto cleanup_candev;
|
||||||
|
|
||||||
@@ -966,7 +966,7 @@ static int usb_8dev_probe(struct usb_interface *intf,
|
|||||||
if (err) {
|
if (err) {
|
||||||
netdev_err(netdev,
|
netdev_err(netdev,
|
||||||
"couldn't register CAN device: %d\n", err);
|
"couldn't register CAN device: %d\n", err);
|
||||||
goto cleanup_cmd_msg_buffer;
|
goto cleanup_candev;
|
||||||
}
|
}
|
||||||
|
|
||||||
err = usb_8dev_cmd_version(priv, &version);
|
err = usb_8dev_cmd_version(priv, &version);
|
||||||
@@ -987,9 +987,6 @@ static int usb_8dev_probe(struct usb_interface *intf,
|
|||||||
cleanup_unregister_candev:
|
cleanup_unregister_candev:
|
||||||
unregister_netdev(priv->netdev);
|
unregister_netdev(priv->netdev);
|
||||||
|
|
||||||
cleanup_cmd_msg_buffer:
|
|
||||||
kfree(priv->cmd_msg_buffer);
|
|
||||||
|
|
||||||
cleanup_candev:
|
cleanup_candev:
|
||||||
free_candev(netdev);
|
free_candev(netdev);
|
||||||
|
|
||||||
|
|||||||
@@ -1276,18 +1276,6 @@ err_out:
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void __exit dec_lance_remove(struct device *bdev)
|
|
||||||
{
|
|
||||||
struct net_device *dev = dev_get_drvdata(bdev);
|
|
||||||
resource_size_t start, len;
|
|
||||||
|
|
||||||
unregister_netdev(dev);
|
|
||||||
start = to_tc_dev(bdev)->resource.start;
|
|
||||||
len = to_tc_dev(bdev)->resource.end - start + 1;
|
|
||||||
release_mem_region(start, len);
|
|
||||||
free_netdev(dev);
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Find all the lance cards on the system and initialize them */
|
/* Find all the lance cards on the system and initialize them */
|
||||||
static int __init dec_lance_platform_probe(void)
|
static int __init dec_lance_platform_probe(void)
|
||||||
{
|
{
|
||||||
@@ -1320,7 +1308,7 @@ static void __exit dec_lance_platform_remove(void)
|
|||||||
|
|
||||||
#ifdef CONFIG_TC
|
#ifdef CONFIG_TC
|
||||||
static int dec_lance_tc_probe(struct device *dev);
|
static int dec_lance_tc_probe(struct device *dev);
|
||||||
static int __exit dec_lance_tc_remove(struct device *dev);
|
static int dec_lance_tc_remove(struct device *dev);
|
||||||
|
|
||||||
static const struct tc_device_id dec_lance_tc_table[] = {
|
static const struct tc_device_id dec_lance_tc_table[] = {
|
||||||
{ "DEC ", "PMAD-AA " },
|
{ "DEC ", "PMAD-AA " },
|
||||||
@@ -1334,7 +1322,7 @@ static struct tc_driver dec_lance_tc_driver = {
|
|||||||
.name = "declance",
|
.name = "declance",
|
||||||
.bus = &tc_bus_type,
|
.bus = &tc_bus_type,
|
||||||
.probe = dec_lance_tc_probe,
|
.probe = dec_lance_tc_probe,
|
||||||
.remove = __exit_p(dec_lance_tc_remove),
|
.remove = dec_lance_tc_remove,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -1346,7 +1334,19 @@ static int dec_lance_tc_probe(struct device *dev)
|
|||||||
return status;
|
return status;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __exit dec_lance_tc_remove(struct device *dev)
|
static void dec_lance_remove(struct device *bdev)
|
||||||
|
{
|
||||||
|
struct net_device *dev = dev_get_drvdata(bdev);
|
||||||
|
resource_size_t start, len;
|
||||||
|
|
||||||
|
unregister_netdev(dev);
|
||||||
|
start = to_tc_dev(bdev)->resource.start;
|
||||||
|
len = to_tc_dev(bdev)->resource.end - start + 1;
|
||||||
|
release_mem_region(start, len);
|
||||||
|
free_netdev(dev);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int dec_lance_tc_remove(struct device *dev)
|
||||||
{
|
{
|
||||||
put_device(dev);
|
put_device(dev);
|
||||||
dec_lance_remove(dev);
|
dec_lance_remove(dev);
|
||||||
|
|||||||
@@ -1323,7 +1323,7 @@ static int xgbe_read_ext_mii_regs(struct xgbe_prv_data *pdata, int addr,
|
|||||||
static int xgbe_set_ext_mii_mode(struct xgbe_prv_data *pdata, unsigned int port,
|
static int xgbe_set_ext_mii_mode(struct xgbe_prv_data *pdata, unsigned int port,
|
||||||
enum xgbe_mdio_mode mode)
|
enum xgbe_mdio_mode mode)
|
||||||
{
|
{
|
||||||
unsigned int reg_val = 0;
|
unsigned int reg_val = XGMAC_IOREAD(pdata, MAC_MDIOCL22R);
|
||||||
|
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case XGBE_MDIO_MODE_CL22:
|
case XGBE_MDIO_MODE_CL22:
|
||||||
|
|||||||
@@ -1131,12 +1131,12 @@ static void xgbe_stop(struct xgbe_prv_data *pdata)
|
|||||||
hw_if->disable_tx(pdata);
|
hw_if->disable_tx(pdata);
|
||||||
hw_if->disable_rx(pdata);
|
hw_if->disable_rx(pdata);
|
||||||
|
|
||||||
|
phy_if->phy_stop(pdata);
|
||||||
|
|
||||||
xgbe_free_irqs(pdata);
|
xgbe_free_irqs(pdata);
|
||||||
|
|
||||||
xgbe_napi_disable(pdata, 1);
|
xgbe_napi_disable(pdata, 1);
|
||||||
|
|
||||||
phy_if->phy_stop(pdata);
|
|
||||||
|
|
||||||
hw_if->exit(pdata);
|
hw_if->exit(pdata);
|
||||||
|
|
||||||
channel = pdata->channel;
|
channel = pdata->channel;
|
||||||
|
|||||||
@@ -716,6 +716,8 @@ static void xgbe_phy_sfp_phy_settings(struct xgbe_prv_data *pdata)
|
|||||||
pdata->phy.duplex = DUPLEX_UNKNOWN;
|
pdata->phy.duplex = DUPLEX_UNKNOWN;
|
||||||
pdata->phy.autoneg = AUTONEG_ENABLE;
|
pdata->phy.autoneg = AUTONEG_ENABLE;
|
||||||
pdata->phy.advertising = pdata->phy.supported;
|
pdata->phy.advertising = pdata->phy.supported;
|
||||||
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
pdata->phy.advertising &= ~ADVERTISED_Autoneg;
|
pdata->phy.advertising &= ~ADVERTISED_Autoneg;
|
||||||
@@ -875,6 +877,16 @@ static int xgbe_phy_find_phy_device(struct xgbe_prv_data *pdata)
|
|||||||
!phy_data->sfp_phy_avail)
|
!phy_data->sfp_phy_avail)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
/* Set the proper MDIO mode for the PHY */
|
||||||
|
ret = pdata->hw_if.set_ext_mii_mode(pdata, phy_data->mdio_addr,
|
||||||
|
phy_data->phydev_mode);
|
||||||
|
if (ret) {
|
||||||
|
netdev_err(pdata->netdev,
|
||||||
|
"mdio port/clause not compatible (%u/%u)\n",
|
||||||
|
phy_data->mdio_addr, phy_data->phydev_mode);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
|
||||||
/* Create and connect to the PHY device */
|
/* Create and connect to the PHY device */
|
||||||
phydev = get_phy_device(phy_data->mii, phy_data->mdio_addr,
|
phydev = get_phy_device(phy_data->mii, phy_data->mdio_addr,
|
||||||
(phy_data->phydev_mode == XGBE_MDIO_MODE_CL45));
|
(phy_data->phydev_mode == XGBE_MDIO_MODE_CL45));
|
||||||
@@ -2722,6 +2734,18 @@ static int xgbe_phy_start(struct xgbe_prv_data *pdata)
|
|||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
|
/* Set the proper MDIO mode for the re-driver */
|
||||||
|
if (phy_data->redrv && !phy_data->redrv_if) {
|
||||||
|
ret = pdata->hw_if.set_ext_mii_mode(pdata, phy_data->redrv_addr,
|
||||||
|
XGBE_MDIO_MODE_CL22);
|
||||||
|
if (ret) {
|
||||||
|
netdev_err(pdata->netdev,
|
||||||
|
"redriver mdio port not compatible (%u)\n",
|
||||||
|
phy_data->redrv_addr);
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Start in highest supported mode */
|
/* Start in highest supported mode */
|
||||||
xgbe_phy_set_mode(pdata, phy_data->start_mode);
|
xgbe_phy_set_mode(pdata, phy_data->start_mode);
|
||||||
|
|
||||||
|
|||||||
@@ -1749,6 +1749,12 @@ static int xgene_enet_get_resources(struct xgene_enet_pdata *pdata)
|
|||||||
|
|
||||||
pdata->clk = devm_clk_get(&pdev->dev, NULL);
|
pdata->clk = devm_clk_get(&pdev->dev, NULL);
|
||||||
if (IS_ERR(pdata->clk)) {
|
if (IS_ERR(pdata->clk)) {
|
||||||
|
/* Abort if the clock is defined but couldn't be retrived.
|
||||||
|
* Always abort if the clock is missing on DT system as
|
||||||
|
* the driver can't cope with this case.
|
||||||
|
*/
|
||||||
|
if (PTR_ERR(pdata->clk) != -ENOENT || dev->of_node)
|
||||||
|
return PTR_ERR(pdata->clk);
|
||||||
/* Firmware may have set up the clock already. */
|
/* Firmware may have set up the clock already. */
|
||||||
dev_info(dev, "clocks have been setup already\n");
|
dev_info(dev, "clocks have been setup already\n");
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -51,8 +51,7 @@ static void platform_bgmac_idm_write(struct bgmac *bgmac, u16 offset, u32 value)
|
|||||||
|
|
||||||
static bool platform_bgmac_clk_enabled(struct bgmac *bgmac)
|
static bool platform_bgmac_clk_enabled(struct bgmac *bgmac)
|
||||||
{
|
{
|
||||||
if ((bgmac_idm_read(bgmac, BCMA_IOCTL) &
|
if ((bgmac_idm_read(bgmac, BCMA_IOCTL) & BGMAC_CLK_EN) != BGMAC_CLK_EN)
|
||||||
(BCMA_IOCTL_CLK | BCMA_IOCTL_FGC)) != BCMA_IOCTL_CLK)
|
|
||||||
return false;
|
return false;
|
||||||
if (bgmac_idm_read(bgmac, BCMA_RESET_CTL) & BCMA_RESET_CTL_RESET)
|
if (bgmac_idm_read(bgmac, BCMA_RESET_CTL) & BCMA_RESET_CTL_RESET)
|
||||||
return false;
|
return false;
|
||||||
@@ -61,15 +60,25 @@ static bool platform_bgmac_clk_enabled(struct bgmac *bgmac)
|
|||||||
|
|
||||||
static void platform_bgmac_clk_enable(struct bgmac *bgmac, u32 flags)
|
static void platform_bgmac_clk_enable(struct bgmac *bgmac, u32 flags)
|
||||||
{
|
{
|
||||||
bgmac_idm_write(bgmac, BCMA_IOCTL,
|
u32 val;
|
||||||
(BCMA_IOCTL_CLK | BCMA_IOCTL_FGC | flags));
|
|
||||||
bgmac_idm_read(bgmac, BCMA_IOCTL);
|
|
||||||
|
|
||||||
bgmac_idm_write(bgmac, BCMA_RESET_CTL, 0);
|
/* The Reset Control register only contains a single bit to show if the
|
||||||
bgmac_idm_read(bgmac, BCMA_RESET_CTL);
|
* controller is currently in reset. Do a sanity check here, just in
|
||||||
udelay(1);
|
* case the bootloader happened to leave the device in reset.
|
||||||
|
*/
|
||||||
|
val = bgmac_idm_read(bgmac, BCMA_RESET_CTL);
|
||||||
|
if (val) {
|
||||||
|
bgmac_idm_write(bgmac, BCMA_RESET_CTL, 0);
|
||||||
|
bgmac_idm_read(bgmac, BCMA_RESET_CTL);
|
||||||
|
udelay(1);
|
||||||
|
}
|
||||||
|
|
||||||
bgmac_idm_write(bgmac, BCMA_IOCTL, (BCMA_IOCTL_CLK | flags));
|
val = bgmac_idm_read(bgmac, BCMA_IOCTL);
|
||||||
|
/* Some bits of BCMA_IOCTL set by HW/ATF and should not change */
|
||||||
|
val |= flags & ~(BGMAC_AWCACHE | BGMAC_ARCACHE | BGMAC_AWUSER |
|
||||||
|
BGMAC_ARUSER);
|
||||||
|
val |= BGMAC_CLK_EN;
|
||||||
|
bgmac_idm_write(bgmac, BCMA_IOCTL, val);
|
||||||
bgmac_idm_read(bgmac, BCMA_IOCTL);
|
bgmac_idm_read(bgmac, BCMA_IOCTL);
|
||||||
udelay(1);
|
udelay(1);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1223,12 +1223,16 @@ static netdev_tx_t bgmac_start_xmit(struct sk_buff *skb,
|
|||||||
static int bgmac_set_mac_address(struct net_device *net_dev, void *addr)
|
static int bgmac_set_mac_address(struct net_device *net_dev, void *addr)
|
||||||
{
|
{
|
||||||
struct bgmac *bgmac = netdev_priv(net_dev);
|
struct bgmac *bgmac = netdev_priv(net_dev);
|
||||||
|
struct sockaddr *sa = addr;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
ret = eth_prepare_mac_addr_change(net_dev, addr);
|
ret = eth_prepare_mac_addr_change(net_dev, addr);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
bgmac_write_mac_address(bgmac, (u8 *)addr);
|
|
||||||
|
ether_addr_copy(net_dev->dev_addr, sa->sa_data);
|
||||||
|
bgmac_write_mac_address(bgmac, net_dev->dev_addr);
|
||||||
|
|
||||||
eth_commit_mac_addr_change(net_dev, addr);
|
eth_commit_mac_addr_change(net_dev, addr);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -213,6 +213,22 @@
|
|||||||
/* BCMA GMAC core specific IO Control (BCMA_IOCTL) flags */
|
/* BCMA GMAC core specific IO Control (BCMA_IOCTL) flags */
|
||||||
#define BGMAC_BCMA_IOCTL_SW_CLKEN 0x00000004 /* PHY Clock Enable */
|
#define BGMAC_BCMA_IOCTL_SW_CLKEN 0x00000004 /* PHY Clock Enable */
|
||||||
#define BGMAC_BCMA_IOCTL_SW_RESET 0x00000008 /* PHY Reset */
|
#define BGMAC_BCMA_IOCTL_SW_RESET 0x00000008 /* PHY Reset */
|
||||||
|
/* The IOCTL values appear to be different in NS, NSP, and NS2, and do not match
|
||||||
|
* the values directly above
|
||||||
|
*/
|
||||||
|
#define BGMAC_CLK_EN BIT(0)
|
||||||
|
#define BGMAC_RESERVED_0 BIT(1)
|
||||||
|
#define BGMAC_SOURCE_SYNC_MODE_EN BIT(2)
|
||||||
|
#define BGMAC_DEST_SYNC_MODE_EN BIT(3)
|
||||||
|
#define BGMAC_TX_CLK_OUT_INVERT_EN BIT(4)
|
||||||
|
#define BGMAC_DIRECT_GMII_MODE BIT(5)
|
||||||
|
#define BGMAC_CLK_250_SEL BIT(6)
|
||||||
|
#define BGMAC_AWCACHE (0xf << 7)
|
||||||
|
#define BGMAC_RESERVED_1 (0x1f << 11)
|
||||||
|
#define BGMAC_ARCACHE (0xf << 16)
|
||||||
|
#define BGMAC_AWUSER (0x3f << 20)
|
||||||
|
#define BGMAC_ARUSER (0x3f << 26)
|
||||||
|
#define BGMAC_RESERVED BIT(31)
|
||||||
|
|
||||||
/* BCMA GMAC core specific IO status (BCMA_IOST) flags */
|
/* BCMA GMAC core specific IO status (BCMA_IOST) flags */
|
||||||
#define BGMAC_BCMA_IOST_ATTACHED 0x00000800
|
#define BGMAC_BCMA_IOST_ATTACHED 0x00000800
|
||||||
|
|||||||
@@ -2617,7 +2617,7 @@ out_out:
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __exit sbmac_remove(struct platform_device *pldev)
|
static int sbmac_remove(struct platform_device *pldev)
|
||||||
{
|
{
|
||||||
struct net_device *dev = platform_get_drvdata(pldev);
|
struct net_device *dev = platform_get_drvdata(pldev);
|
||||||
struct sbmac_softc *sc = netdev_priv(dev);
|
struct sbmac_softc *sc = netdev_priv(dev);
|
||||||
@@ -2634,7 +2634,7 @@ static int __exit sbmac_remove(struct platform_device *pldev)
|
|||||||
|
|
||||||
static struct platform_driver sbmac_driver = {
|
static struct platform_driver sbmac_driver = {
|
||||||
.probe = sbmac_probe,
|
.probe = sbmac_probe,
|
||||||
.remove = __exit_p(sbmac_remove),
|
.remove = sbmac_remove,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = sbmac_string,
|
.name = sbmac_string,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -37,7 +37,7 @@
|
|||||||
|
|
||||||
#define T4FW_VERSION_MAJOR 0x01
|
#define T4FW_VERSION_MAJOR 0x01
|
||||||
#define T4FW_VERSION_MINOR 0x10
|
#define T4FW_VERSION_MINOR 0x10
|
||||||
#define T4FW_VERSION_MICRO 0x1A
|
#define T4FW_VERSION_MICRO 0x21
|
||||||
#define T4FW_VERSION_BUILD 0x00
|
#define T4FW_VERSION_BUILD 0x00
|
||||||
|
|
||||||
#define T4FW_MIN_VERSION_MAJOR 0x01
|
#define T4FW_MIN_VERSION_MAJOR 0x01
|
||||||
@@ -46,7 +46,7 @@
|
|||||||
|
|
||||||
#define T5FW_VERSION_MAJOR 0x01
|
#define T5FW_VERSION_MAJOR 0x01
|
||||||
#define T5FW_VERSION_MINOR 0x10
|
#define T5FW_VERSION_MINOR 0x10
|
||||||
#define T5FW_VERSION_MICRO 0x1A
|
#define T5FW_VERSION_MICRO 0x21
|
||||||
#define T5FW_VERSION_BUILD 0x00
|
#define T5FW_VERSION_BUILD 0x00
|
||||||
|
|
||||||
#define T5FW_MIN_VERSION_MAJOR 0x00
|
#define T5FW_MIN_VERSION_MAJOR 0x00
|
||||||
@@ -55,7 +55,7 @@
|
|||||||
|
|
||||||
#define T6FW_VERSION_MAJOR 0x01
|
#define T6FW_VERSION_MAJOR 0x01
|
||||||
#define T6FW_VERSION_MINOR 0x10
|
#define T6FW_VERSION_MINOR 0x10
|
||||||
#define T6FW_VERSION_MICRO 0x1A
|
#define T6FW_VERSION_MICRO 0x21
|
||||||
#define T6FW_VERSION_BUILD 0x00
|
#define T6FW_VERSION_BUILD 0x00
|
||||||
|
|
||||||
#define T6FW_MIN_VERSION_MAJOR 0x00
|
#define T6FW_MIN_VERSION_MAJOR 0x00
|
||||||
|
|||||||
@@ -1456,7 +1456,7 @@ err_alloc_etherdev:
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __exit ftgmac100_remove(struct platform_device *pdev)
|
static int ftgmac100_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct net_device *netdev;
|
struct net_device *netdev;
|
||||||
struct ftgmac100 *priv;
|
struct ftgmac100 *priv;
|
||||||
@@ -1483,7 +1483,7 @@ MODULE_DEVICE_TABLE(of, ftgmac100_of_match);
|
|||||||
|
|
||||||
static struct platform_driver ftgmac100_driver = {
|
static struct platform_driver ftgmac100_driver = {
|
||||||
.probe = ftgmac100_probe,
|
.probe = ftgmac100_probe,
|
||||||
.remove = __exit_p(ftgmac100_remove),
|
.remove = ftgmac100_remove,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = DRV_NAME,
|
.name = DRV_NAME,
|
||||||
.of_match_table = ftgmac100_of_match,
|
.of_match_table = ftgmac100_of_match,
|
||||||
|
|||||||
@@ -1156,7 +1156,7 @@ err_alloc_etherdev:
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __exit ftmac100_remove(struct platform_device *pdev)
|
static int ftmac100_remove(struct platform_device *pdev)
|
||||||
{
|
{
|
||||||
struct net_device *netdev;
|
struct net_device *netdev;
|
||||||
struct ftmac100 *priv;
|
struct ftmac100 *priv;
|
||||||
@@ -1176,7 +1176,7 @@ static int __exit ftmac100_remove(struct platform_device *pdev)
|
|||||||
|
|
||||||
static struct platform_driver ftmac100_driver = {
|
static struct platform_driver ftmac100_driver = {
|
||||||
.probe = ftmac100_probe,
|
.probe = ftmac100_probe,
|
||||||
.remove = __exit_p(ftmac100_remove),
|
.remove = ftmac100_remove,
|
||||||
.driver = {
|
.driver = {
|
||||||
.name = DRV_NAME,
|
.name = DRV_NAME,
|
||||||
},
|
},
|
||||||
|
|||||||
@@ -96,7 +96,7 @@
|
|||||||
#define IXGBE_MAX_FRAME_BUILD_SKB \
|
#define IXGBE_MAX_FRAME_BUILD_SKB \
|
||||||
(SKB_WITH_OVERHEAD(IXGBE_RXBUFFER_2K) - IXGBE_SKB_PAD)
|
(SKB_WITH_OVERHEAD(IXGBE_RXBUFFER_2K) - IXGBE_SKB_PAD)
|
||||||
#else
|
#else
|
||||||
#define IGB_MAX_FRAME_BUILD_SKB IXGBE_RXBUFFER_2K
|
#define IXGBE_MAX_FRAME_BUILD_SKB IXGBE_RXBUFFER_2K
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@@ -929,6 +929,7 @@ netdev_tx_t ixgbe_xmit_frame_ring(struct sk_buff *skb,
|
|||||||
struct ixgbe_adapter *adapter,
|
struct ixgbe_adapter *adapter,
|
||||||
struct ixgbe_ring *tx_ring);
|
struct ixgbe_ring *tx_ring);
|
||||||
u32 ixgbe_rss_indir_tbl_entries(struct ixgbe_adapter *adapter);
|
u32 ixgbe_rss_indir_tbl_entries(struct ixgbe_adapter *adapter);
|
||||||
|
void ixgbe_store_key(struct ixgbe_adapter *adapter);
|
||||||
void ixgbe_store_reta(struct ixgbe_adapter *adapter);
|
void ixgbe_store_reta(struct ixgbe_adapter *adapter);
|
||||||
s32 ixgbe_negotiate_fc(struct ixgbe_hw *hw, u32 adv_reg, u32 lp_reg,
|
s32 ixgbe_negotiate_fc(struct ixgbe_hw *hw, u32 adv_reg, u32 lp_reg,
|
||||||
u32 adv_sym, u32 adv_asm, u32 lp_sym, u32 lp_asm);
|
u32 adv_sym, u32 adv_asm, u32 lp_sym, u32 lp_asm);
|
||||||
|
|||||||
@@ -2998,8 +2998,10 @@ static int ixgbe_set_rxfh(struct net_device *netdev, const u32 *indir,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/* Fill out the rss hash key */
|
/* Fill out the rss hash key */
|
||||||
if (key)
|
if (key) {
|
||||||
memcpy(adapter->rss_key, key, ixgbe_get_rxfh_key_size(netdev));
|
memcpy(adapter->rss_key, key, ixgbe_get_rxfh_key_size(netdev));
|
||||||
|
ixgbe_store_key(adapter);
|
||||||
|
}
|
||||||
|
|
||||||
ixgbe_store_reta(adapter);
|
ixgbe_store_reta(adapter);
|
||||||
|
|
||||||
|
|||||||
@@ -3473,6 +3473,21 @@ u32 ixgbe_rss_indir_tbl_entries(struct ixgbe_adapter *adapter)
|
|||||||
return 512;
|
return 512;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* ixgbe_store_key - Write the RSS key to HW
|
||||||
|
* @adapter: device handle
|
||||||
|
*
|
||||||
|
* Write the RSS key stored in adapter.rss_key to HW.
|
||||||
|
*/
|
||||||
|
void ixgbe_store_key(struct ixgbe_adapter *adapter)
|
||||||
|
{
|
||||||
|
struct ixgbe_hw *hw = &adapter->hw;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 0; i < 10; i++)
|
||||||
|
IXGBE_WRITE_REG(hw, IXGBE_RSSRK(i), adapter->rss_key[i]);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* ixgbe_store_reta - Write the RETA table to HW
|
* ixgbe_store_reta - Write the RETA table to HW
|
||||||
* @adapter: device handle
|
* @adapter: device handle
|
||||||
@@ -3538,7 +3553,6 @@ static void ixgbe_store_vfreta(struct ixgbe_adapter *adapter)
|
|||||||
|
|
||||||
static void ixgbe_setup_reta(struct ixgbe_adapter *adapter)
|
static void ixgbe_setup_reta(struct ixgbe_adapter *adapter)
|
||||||
{
|
{
|
||||||
struct ixgbe_hw *hw = &adapter->hw;
|
|
||||||
u32 i, j;
|
u32 i, j;
|
||||||
u32 reta_entries = ixgbe_rss_indir_tbl_entries(adapter);
|
u32 reta_entries = ixgbe_rss_indir_tbl_entries(adapter);
|
||||||
u16 rss_i = adapter->ring_feature[RING_F_RSS].indices;
|
u16 rss_i = adapter->ring_feature[RING_F_RSS].indices;
|
||||||
@@ -3551,8 +3565,7 @@ static void ixgbe_setup_reta(struct ixgbe_adapter *adapter)
|
|||||||
rss_i = 4;
|
rss_i = 4;
|
||||||
|
|
||||||
/* Fill out hash function seeds */
|
/* Fill out hash function seeds */
|
||||||
for (i = 0; i < 10; i++)
|
ixgbe_store_key(adapter);
|
||||||
IXGBE_WRITE_REG(hw, IXGBE_RSSRK(i), adapter->rss_key[i]);
|
|
||||||
|
|
||||||
/* Fill out redirection table */
|
/* Fill out redirection table */
|
||||||
memset(adapter->rss_indir_tbl, 0, sizeof(adapter->rss_indir_tbl));
|
memset(adapter->rss_indir_tbl, 0, sizeof(adapter->rss_indir_tbl));
|
||||||
@@ -3959,7 +3972,8 @@ static void ixgbe_set_rx_buffer_len(struct ixgbe_adapter *adapter)
|
|||||||
if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED)
|
if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED)
|
||||||
set_bit(__IXGBE_RX_3K_BUFFER, &rx_ring->state);
|
set_bit(__IXGBE_RX_3K_BUFFER, &rx_ring->state);
|
||||||
|
|
||||||
if (max_frame > (ETH_FRAME_LEN + ETH_FCS_LEN))
|
if ((max_frame > (ETH_FRAME_LEN + ETH_FCS_LEN)) ||
|
||||||
|
(max_frame > IXGBE_MAX_FRAME_BUILD_SKB))
|
||||||
set_bit(__IXGBE_RX_3K_BUFFER, &rx_ring->state);
|
set_bit(__IXGBE_RX_3K_BUFFER, &rx_ring->state);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user