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-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/davem/net-2.6: (37 commits) smc91c92_cs: fix the problem of "Unable to find hardware address" r8169: clean up my printk uglyness net: Hook up cxgb4 to Kconfig and Makefile cxgb4: Add main driver file and driver Makefile cxgb4: Add remaining driver headers and L2T management cxgb4: Add packet queues and packet DMA code cxgb4: Add HW and FW support code cxgb4: Add register, message, and FW definitions netlabel: Fix several rcu_dereference() calls used without RCU read locks bonding: fix potential deadlock in bond_uninit() net: check the length of the socket address passed to connect(2) stmmac: add documentation for the driver. stmmac: fix kconfig for crc32 build error be2net: fix bug in vlan rx path for big endian architecture be2net: fix flashing on big endian architectures be2net: fix a bug in flashing the redboot section bonding: bond_xmit_roundrobin() fix drivers/net: Add missing unlock net: gianfar - align BD ring size console messages net: gianfar - initialize per-queue statistics ...
This commit is contained in:
@@ -0,0 +1,143 @@
|
|||||||
|
STMicroelectronics 10/100/1000 Synopsys Ethernet driver
|
||||||
|
|
||||||
|
Copyright (C) 2007-2010 STMicroelectronics Ltd
|
||||||
|
Author: Giuseppe Cavallaro <peppe.cavallaro@st.com>
|
||||||
|
|
||||||
|
This is the driver for the MAC 10/100/1000 on-chip Ethernet controllers
|
||||||
|
(Synopsys IP blocks); it has been fully tested on STLinux platforms.
|
||||||
|
|
||||||
|
Currently this network device driver is for all STM embedded MAC/GMAC
|
||||||
|
(7xxx SoCs).
|
||||||
|
|
||||||
|
DWC Ether MAC 10/100/1000 Universal version 3.41a and DWC Ether MAC 10/100
|
||||||
|
Universal version 4.0 have been used for developing the first code
|
||||||
|
implementation.
|
||||||
|
|
||||||
|
Please, for more information also visit: www.stlinux.com
|
||||||
|
|
||||||
|
1) Kernel Configuration
|
||||||
|
The kernel configuration option is STMMAC_ETH:
|
||||||
|
Device Drivers ---> Network device support ---> Ethernet (1000 Mbit) --->
|
||||||
|
STMicroelectronics 10/100/1000 Ethernet driver (STMMAC_ETH)
|
||||||
|
|
||||||
|
2) Driver parameters list:
|
||||||
|
debug: message level (0: no output, 16: all);
|
||||||
|
phyaddr: to manually provide the physical address to the PHY device;
|
||||||
|
dma_rxsize: DMA rx ring size;
|
||||||
|
dma_txsize: DMA tx ring size;
|
||||||
|
buf_sz: DMA buffer size;
|
||||||
|
tc: control the HW FIFO threshold;
|
||||||
|
tx_coe: Enable/Disable Tx Checksum Offload engine;
|
||||||
|
watchdog: transmit timeout (in milliseconds);
|
||||||
|
flow_ctrl: Flow control ability [on/off];
|
||||||
|
pause: Flow Control Pause Time;
|
||||||
|
tmrate: timer period (only if timer optimisation is configured).
|
||||||
|
|
||||||
|
3) Command line options
|
||||||
|
Driver parameters can be also passed in command line by using:
|
||||||
|
stmmaceth=dma_rxsize:128,dma_txsize:512
|
||||||
|
|
||||||
|
4) Driver information and notes
|
||||||
|
|
||||||
|
4.1) Transmit process
|
||||||
|
The xmit method is invoked when the kernel needs to transmit a packet; it sets
|
||||||
|
the descriptors in the ring and informs the DMA engine that there is a packet
|
||||||
|
ready to be transmitted.
|
||||||
|
Once the controller has finished transmitting the packet, an interrupt is
|
||||||
|
triggered; So the driver will be able to release the socket buffers.
|
||||||
|
By default, the driver sets the NETIF_F_SG bit in the features field of the
|
||||||
|
net_device structure enabling the scatter/gather feature.
|
||||||
|
|
||||||
|
4.2) Receive process
|
||||||
|
When one or more packets are received, an interrupt happens. The interrupts
|
||||||
|
are not queued so the driver has to scan all the descriptors in the ring during
|
||||||
|
the receive process.
|
||||||
|
This is based on NAPI so the interrupt handler signals only if there is work to be
|
||||||
|
done, and it exits.
|
||||||
|
Then the poll method will be scheduled at some future point.
|
||||||
|
The incoming packets are stored, by the DMA, in a list of pre-allocated socket
|
||||||
|
buffers in order to avoid the memcpy (Zero-copy).
|
||||||
|
|
||||||
|
4.3) Timer-Driver Interrupt
|
||||||
|
Instead of having the device that asynchronously notifies the frame receptions, the
|
||||||
|
driver configures a timer to generate an interrupt at regular intervals.
|
||||||
|
Based on the granularity of the timer, the frames that are received by the device
|
||||||
|
will experience different levels of latency. Some NICs have dedicated timer
|
||||||
|
device to perform this task. STMMAC can use either the RTC device or the TMU
|
||||||
|
channel 2 on STLinux platforms.
|
||||||
|
The timers frequency can be passed to the driver as parameter; when change it,
|
||||||
|
take care of both hardware capability and network stability/performance impact.
|
||||||
|
Several performance tests on STM platforms showed this optimisation allows to spare
|
||||||
|
the CPU while having the maximum throughput.
|
||||||
|
|
||||||
|
4.4) WOL
|
||||||
|
Wake up on Lan feature through Magic Frame is only supported for the GMAC
|
||||||
|
core.
|
||||||
|
|
||||||
|
4.5) DMA descriptors
|
||||||
|
Driver handles both normal and enhanced descriptors. The latter has been only
|
||||||
|
tested on DWC Ether MAC 10/100/1000 Universal version 3.41a.
|
||||||
|
|
||||||
|
4.6) Ethtool support
|
||||||
|
Ethtool is supported. Driver statistics and internal errors can be taken using:
|
||||||
|
ethtool -S ethX command. It is possible to dump registers etc.
|
||||||
|
|
||||||
|
4.7) Jumbo and Segmentation Offloading
|
||||||
|
Jumbo frames are supported and tested for the GMAC.
|
||||||
|
The GSO has been also added but it's performed in software.
|
||||||
|
LRO is not supported.
|
||||||
|
|
||||||
|
4.8) Physical
|
||||||
|
The driver is compatible with PAL to work with PHY and GPHY devices.
|
||||||
|
|
||||||
|
4.9) Platform information
|
||||||
|
Several information came from the platform; please refer to the
|
||||||
|
driver's Header file in include/linux directory.
|
||||||
|
|
||||||
|
struct plat_stmmacenet_data {
|
||||||
|
int bus_id;
|
||||||
|
int pbl;
|
||||||
|
int has_gmac;
|
||||||
|
void (*fix_mac_speed)(void *priv, unsigned int speed);
|
||||||
|
void (*bus_setup)(unsigned long ioaddr);
|
||||||
|
#ifdef CONFIG_STM_DRIVERS
|
||||||
|
struct stm_pad_config *pad_config;
|
||||||
|
#endif
|
||||||
|
void *bsp_priv;
|
||||||
|
};
|
||||||
|
|
||||||
|
Where:
|
||||||
|
- pbl (Programmable Burst Length) is maximum number of
|
||||||
|
beats to be transferred in one DMA transaction.
|
||||||
|
GMAC also enables the 4xPBL by default.
|
||||||
|
- fix_mac_speed and bus_setup are used to configure internal target
|
||||||
|
registers (on STM platforms);
|
||||||
|
- has_gmac: GMAC core is on board (get it at run-time in the next step);
|
||||||
|
- bus_id: bus identifier.
|
||||||
|
|
||||||
|
struct plat_stmmacphy_data {
|
||||||
|
int bus_id;
|
||||||
|
int phy_addr;
|
||||||
|
unsigned int phy_mask;
|
||||||
|
int interface;
|
||||||
|
int (*phy_reset)(void *priv);
|
||||||
|
void *priv;
|
||||||
|
};
|
||||||
|
|
||||||
|
Where:
|
||||||
|
- bus_id: bus identifier;
|
||||||
|
- phy_addr: physical address used for the attached phy device;
|
||||||
|
set it to -1 to get it at run-time;
|
||||||
|
- interface: physical MII interface mode;
|
||||||
|
- phy_reset: hook to reset HW function.
|
||||||
|
|
||||||
|
TODO:
|
||||||
|
- Continue to make the driver more generic and suitable for other Synopsys
|
||||||
|
Ethernet controllers used on other architectures (i.e. ARM).
|
||||||
|
- 10G controllers are not supported.
|
||||||
|
- MAC uses Normal descriptors and GMAC uses enhanced ones.
|
||||||
|
This is a limit that should be reviewed. MAC could want to
|
||||||
|
use the enhanced structure.
|
||||||
|
- Checksumming: Rx/Tx csum is done in HW in case of GMAC only.
|
||||||
|
- Review the timer optimisation code to use an embedded device that seems to be
|
||||||
|
available in new chip generations.
|
||||||
@@ -2582,6 +2582,31 @@ config CHELSIO_T3
|
|||||||
To compile this driver as a module, choose M here: the module
|
To compile this driver as a module, choose M here: the module
|
||||||
will be called cxgb3.
|
will be called cxgb3.
|
||||||
|
|
||||||
|
config CHELSIO_T4_DEPENDS
|
||||||
|
tristate
|
||||||
|
depends on PCI && INET
|
||||||
|
default y
|
||||||
|
|
||||||
|
config CHELSIO_T4
|
||||||
|
tristate "Chelsio Communications T4 Ethernet support"
|
||||||
|
depends on CHELSIO_T4_DEPENDS
|
||||||
|
select FW_LOADER
|
||||||
|
select MDIO
|
||||||
|
help
|
||||||
|
This driver supports Chelsio T4-based gigabit and 10Gb Ethernet
|
||||||
|
adapters.
|
||||||
|
|
||||||
|
For general information about Chelsio and our products, visit
|
||||||
|
our website at <http://www.chelsio.com>.
|
||||||
|
|
||||||
|
For customer support, please visit our customer support page at
|
||||||
|
<http://www.chelsio.com/support.htm>.
|
||||||
|
|
||||||
|
Please send feedback to <linux-bugs@chelsio.com>.
|
||||||
|
|
||||||
|
To compile this driver as a module choose M here; the module
|
||||||
|
will be called cxgb4.
|
||||||
|
|
||||||
config EHEA
|
config EHEA
|
||||||
tristate "eHEA Ethernet support"
|
tristate "eHEA Ethernet support"
|
||||||
depends on IBMEBUS && INET && SPARSEMEM
|
depends on IBMEBUS && INET && SPARSEMEM
|
||||||
|
|||||||
@@ -19,6 +19,7 @@ obj-$(CONFIG_IXGB) += ixgb/
|
|||||||
obj-$(CONFIG_IP1000) += ipg.o
|
obj-$(CONFIG_IP1000) += ipg.o
|
||||||
obj-$(CONFIG_CHELSIO_T1) += chelsio/
|
obj-$(CONFIG_CHELSIO_T1) += chelsio/
|
||||||
obj-$(CONFIG_CHELSIO_T3) += cxgb3/
|
obj-$(CONFIG_CHELSIO_T3) += cxgb3/
|
||||||
|
obj-$(CONFIG_CHELSIO_T4) += cxgb4/
|
||||||
obj-$(CONFIG_EHEA) += ehea/
|
obj-$(CONFIG_EHEA) += ehea/
|
||||||
obj-$(CONFIG_CAN) += can/
|
obj-$(CONFIG_CAN) += can/
|
||||||
obj-$(CONFIG_BONDING) += bonding/
|
obj-$(CONFIG_BONDING) += bonding/
|
||||||
|
|||||||
@@ -1464,8 +1464,8 @@ int be_cmd_get_flash_crc(struct be_adapter *adapter, u8 *flashed_crc,
|
|||||||
|
|
||||||
req->params.op_type = cpu_to_le32(IMG_TYPE_REDBOOT);
|
req->params.op_type = cpu_to_le32(IMG_TYPE_REDBOOT);
|
||||||
req->params.op_code = cpu_to_le32(FLASHROM_OPER_REPORT);
|
req->params.op_code = cpu_to_le32(FLASHROM_OPER_REPORT);
|
||||||
req->params.offset = offset;
|
req->params.offset = cpu_to_le32(offset);
|
||||||
req->params.data_buf_size = 0x4;
|
req->params.data_buf_size = cpu_to_le32(0x4);
|
||||||
|
|
||||||
status = be_mcc_notify_wait(adapter);
|
status = be_mcc_notify_wait(adapter);
|
||||||
if (!status)
|
if (!status)
|
||||||
|
|||||||
+10
-11
@@ -807,7 +807,7 @@ static void be_rx_compl_process(struct be_adapter *adapter,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
vid = AMAP_GET_BITS(struct amap_eth_rx_compl, vlan_tag, rxcp);
|
vid = AMAP_GET_BITS(struct amap_eth_rx_compl, vlan_tag, rxcp);
|
||||||
vid = be16_to_cpu(vid);
|
vid = swab16(vid);
|
||||||
vlan_hwaccel_receive_skb(skb, adapter->vlan_grp, vid);
|
vlan_hwaccel_receive_skb(skb, adapter->vlan_grp, vid);
|
||||||
} else {
|
} else {
|
||||||
netif_receive_skb(skb);
|
netif_receive_skb(skb);
|
||||||
@@ -884,7 +884,7 @@ static void be_rx_compl_process_gro(struct be_adapter *adapter,
|
|||||||
napi_gro_frags(&eq_obj->napi);
|
napi_gro_frags(&eq_obj->napi);
|
||||||
} else {
|
} else {
|
||||||
vid = AMAP_GET_BITS(struct amap_eth_rx_compl, vlan_tag, rxcp);
|
vid = AMAP_GET_BITS(struct amap_eth_rx_compl, vlan_tag, rxcp);
|
||||||
vid = be16_to_cpu(vid);
|
vid = swab16(vid);
|
||||||
|
|
||||||
if (!adapter->vlan_grp || adapter->vlans_added == 0)
|
if (!adapter->vlan_grp || adapter->vlans_added == 0)
|
||||||
return;
|
return;
|
||||||
@@ -1855,7 +1855,7 @@ static bool be_flash_redboot(struct be_adapter *adapter,
|
|||||||
p += crc_offset;
|
p += crc_offset;
|
||||||
|
|
||||||
status = be_cmd_get_flash_crc(adapter, flashed_crc,
|
status = be_cmd_get_flash_crc(adapter, flashed_crc,
|
||||||
(img_start + image_size - 4));
|
(image_size - 4));
|
||||||
if (status) {
|
if (status) {
|
||||||
dev_err(&adapter->pdev->dev,
|
dev_err(&adapter->pdev->dev,
|
||||||
"could not get crc from flash, not flashing redboot\n");
|
"could not get crc from flash, not flashing redboot\n");
|
||||||
@@ -1991,7 +1991,7 @@ int be_load_fw(struct be_adapter *adapter, u8 *func)
|
|||||||
struct flash_file_hdr_g3 *fhdr3;
|
struct flash_file_hdr_g3 *fhdr3;
|
||||||
struct image_hdr *img_hdr_ptr = NULL;
|
struct image_hdr *img_hdr_ptr = NULL;
|
||||||
struct be_dma_mem flash_cmd;
|
struct be_dma_mem flash_cmd;
|
||||||
int status, i = 0;
|
int status, i = 0, num_imgs = 0;
|
||||||
const u8 *p;
|
const u8 *p;
|
||||||
|
|
||||||
strcpy(fw_file, func);
|
strcpy(fw_file, func);
|
||||||
@@ -2017,15 +2017,14 @@ int be_load_fw(struct be_adapter *adapter, u8 *func)
|
|||||||
if ((adapter->generation == BE_GEN3) &&
|
if ((adapter->generation == BE_GEN3) &&
|
||||||
(get_ufigen_type(fhdr) == BE_GEN3)) {
|
(get_ufigen_type(fhdr) == BE_GEN3)) {
|
||||||
fhdr3 = (struct flash_file_hdr_g3 *) fw->data;
|
fhdr3 = (struct flash_file_hdr_g3 *) fw->data;
|
||||||
for (i = 0; i < fhdr3->num_imgs; i++) {
|
num_imgs = le32_to_cpu(fhdr3->num_imgs);
|
||||||
|
for (i = 0; i < num_imgs; i++) {
|
||||||
img_hdr_ptr = (struct image_hdr *) (fw->data +
|
img_hdr_ptr = (struct image_hdr *) (fw->data +
|
||||||
(sizeof(struct flash_file_hdr_g3) +
|
(sizeof(struct flash_file_hdr_g3) +
|
||||||
i * sizeof(struct image_hdr)));
|
i * sizeof(struct image_hdr)));
|
||||||
if (img_hdr_ptr->imageid == 1) {
|
if (le32_to_cpu(img_hdr_ptr->imageid) == 1)
|
||||||
status = be_flash_data(adapter, fw,
|
status = be_flash_data(adapter, fw, &flash_cmd,
|
||||||
&flash_cmd, fhdr3->num_imgs);
|
num_imgs);
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
} else if ((adapter->generation == BE_GEN2) &&
|
} else if ((adapter->generation == BE_GEN2) &&
|
||||||
(get_ufigen_type(fhdr) == BE_GEN2)) {
|
(get_ufigen_type(fhdr) == BE_GEN2)) {
|
||||||
|
|||||||
@@ -4156,7 +4156,7 @@ static int bond_xmit_roundrobin(struct sk_buff *skb, struct net_device *bond_dev
|
|||||||
* send the join/membership reports. The curr_active_slave found
|
* send the join/membership reports. The curr_active_slave found
|
||||||
* will send all of this type of traffic.
|
* will send all of this type of traffic.
|
||||||
*/
|
*/
|
||||||
if ((iph->protocol == htons(IPPROTO_IGMP)) &&
|
if ((iph->protocol == IPPROTO_IGMP) &&
|
||||||
(skb->protocol == htons(ETH_P_IP))) {
|
(skb->protocol == htons(ETH_P_IP))) {
|
||||||
|
|
||||||
read_lock(&bond->curr_slave_lock);
|
read_lock(&bond->curr_slave_lock);
|
||||||
@@ -4450,6 +4450,14 @@ static const struct net_device_ops bond_netdev_ops = {
|
|||||||
.ndo_vlan_rx_kill_vid = bond_vlan_rx_kill_vid,
|
.ndo_vlan_rx_kill_vid = bond_vlan_rx_kill_vid,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void bond_destructor(struct net_device *bond_dev)
|
||||||
|
{
|
||||||
|
struct bonding *bond = netdev_priv(bond_dev);
|
||||||
|
if (bond->wq)
|
||||||
|
destroy_workqueue(bond->wq);
|
||||||
|
free_netdev(bond_dev);
|
||||||
|
}
|
||||||
|
|
||||||
static void bond_setup(struct net_device *bond_dev)
|
static void bond_setup(struct net_device *bond_dev)
|
||||||
{
|
{
|
||||||
struct bonding *bond = netdev_priv(bond_dev);
|
struct bonding *bond = netdev_priv(bond_dev);
|
||||||
@@ -4470,7 +4478,7 @@ static void bond_setup(struct net_device *bond_dev)
|
|||||||
bond_dev->ethtool_ops = &bond_ethtool_ops;
|
bond_dev->ethtool_ops = &bond_ethtool_ops;
|
||||||
bond_set_mode_ops(bond, bond->params.mode);
|
bond_set_mode_ops(bond, bond->params.mode);
|
||||||
|
|
||||||
bond_dev->destructor = free_netdev;
|
bond_dev->destructor = bond_destructor;
|
||||||
|
|
||||||
/* Initialize the device options */
|
/* Initialize the device options */
|
||||||
bond_dev->tx_queue_len = 0;
|
bond_dev->tx_queue_len = 0;
|
||||||
@@ -4542,9 +4550,6 @@ static void bond_uninit(struct net_device *bond_dev)
|
|||||||
|
|
||||||
bond_remove_proc_entry(bond);
|
bond_remove_proc_entry(bond);
|
||||||
|
|
||||||
if (bond->wq)
|
|
||||||
destroy_workqueue(bond->wq);
|
|
||||||
|
|
||||||
netif_addr_lock_bh(bond_dev);
|
netif_addr_lock_bh(bond_dev);
|
||||||
bond_mc_list_destroy(bond);
|
bond_mc_list_destroy(bond);
|
||||||
netif_addr_unlock_bh(bond_dev);
|
netif_addr_unlock_bh(bond_dev);
|
||||||
@@ -4956,8 +4961,8 @@ int bond_create(struct net *net, const char *name)
|
|||||||
bond_setup);
|
bond_setup);
|
||||||
if (!bond_dev) {
|
if (!bond_dev) {
|
||||||
pr_err("%s: eek! can't alloc netdev!\n", name);
|
pr_err("%s: eek! can't alloc netdev!\n", name);
|
||||||
res = -ENOMEM;
|
rtnl_unlock();
|
||||||
goto out;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
dev_net_set(bond_dev, net);
|
dev_net_set(bond_dev, net);
|
||||||
@@ -4966,19 +4971,16 @@ int bond_create(struct net *net, const char *name)
|
|||||||
if (!name) {
|
if (!name) {
|
||||||
res = dev_alloc_name(bond_dev, "bond%d");
|
res = dev_alloc_name(bond_dev, "bond%d");
|
||||||
if (res < 0)
|
if (res < 0)
|
||||||
goto out_netdev;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
res = register_netdevice(bond_dev);
|
res = register_netdevice(bond_dev);
|
||||||
if (res < 0)
|
|
||||||
goto out_netdev;
|
|
||||||
|
|
||||||
out:
|
out:
|
||||||
rtnl_unlock();
|
rtnl_unlock();
|
||||||
|
if (res < 0)
|
||||||
|
bond_destructor(bond_dev);
|
||||||
return res;
|
return res;
|
||||||
out_netdev:
|
|
||||||
free_netdev(bond_dev);
|
|
||||||
goto out;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int __net_init bond_net_init(struct net *net)
|
static int __net_init bond_net_init(struct net *net)
|
||||||
|
|||||||
@@ -0,0 +1,7 @@
|
|||||||
|
#
|
||||||
|
# Chelsio T4 driver
|
||||||
|
#
|
||||||
|
|
||||||
|
obj-$(CONFIG_CHELSIO_T4) += cxgb4.o
|
||||||
|
|
||||||
|
cxgb4-objs := cxgb4_main.o l2t.o t4_hw.o sge.o
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,239 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the Chelsio T4 Ethernet driver for Linux.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003-2010 Chelsio Communications, Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is available to you under a choice of one of two
|
||||||
|
* licenses. You may choose to be licensed under the terms of the GNU
|
||||||
|
* General Public License (GPL) Version 2, available from the file
|
||||||
|
* COPYING in the main directory of this source tree, or the
|
||||||
|
* OpenIB.org BSD license below:
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or
|
||||||
|
* without modification, are permitted provided that the following
|
||||||
|
* conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the following
|
||||||
|
* disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following
|
||||||
|
* disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||||
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CXGB4_OFLD_H
|
||||||
|
#define __CXGB4_OFLD_H
|
||||||
|
|
||||||
|
#include <linux/cache.h>
|
||||||
|
#include <linux/spinlock.h>
|
||||||
|
#include <linux/skbuff.h>
|
||||||
|
#include <asm/atomic.h>
|
||||||
|
|
||||||
|
/* CPL message priority levels */
|
||||||
|
enum {
|
||||||
|
CPL_PRIORITY_DATA = 0, /* data messages */
|
||||||
|
CPL_PRIORITY_SETUP = 1, /* connection setup messages */
|
||||||
|
CPL_PRIORITY_TEARDOWN = 0, /* connection teardown messages */
|
||||||
|
CPL_PRIORITY_LISTEN = 1, /* listen start/stop messages */
|
||||||
|
CPL_PRIORITY_ACK = 1, /* RX ACK messages */
|
||||||
|
CPL_PRIORITY_CONTROL = 1 /* control messages */
|
||||||
|
};
|
||||||
|
|
||||||
|
#define INIT_TP_WR(w, tid) do { \
|
||||||
|
(w)->wr.wr_hi = htonl(FW_WR_OP(FW_TP_WR) | \
|
||||||
|
FW_WR_IMMDLEN(sizeof(*w) - sizeof(w->wr))); \
|
||||||
|
(w)->wr.wr_mid = htonl(FW_WR_LEN16(DIV_ROUND_UP(sizeof(*w), 16)) | \
|
||||||
|
FW_WR_FLOWID(tid)); \
|
||||||
|
(w)->wr.wr_lo = cpu_to_be64(0); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define INIT_TP_WR_CPL(w, cpl, tid) do { \
|
||||||
|
INIT_TP_WR(w, tid); \
|
||||||
|
OPCODE_TID(w) = htonl(MK_OPCODE_TID(cpl, tid)); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
#define INIT_ULPTX_WR(w, wrlen, atomic, tid) do { \
|
||||||
|
(w)->wr.wr_hi = htonl(FW_WR_OP(FW_ULPTX_WR) | FW_WR_ATOMIC(atomic)); \
|
||||||
|
(w)->wr.wr_mid = htonl(FW_WR_LEN16(DIV_ROUND_UP(wrlen, 16)) | \
|
||||||
|
FW_WR_FLOWID(tid)); \
|
||||||
|
(w)->wr.wr_lo = cpu_to_be64(0); \
|
||||||
|
} while (0)
|
||||||
|
|
||||||
|
/* Special asynchronous notification message */
|
||||||
|
#define CXGB4_MSG_AN ((void *)1)
|
||||||
|
|
||||||
|
struct serv_entry {
|
||||||
|
void *data;
|
||||||
|
};
|
||||||
|
|
||||||
|
union aopen_entry {
|
||||||
|
void *data;
|
||||||
|
union aopen_entry *next;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Holds the size, base address, free list start, etc of the TID, server TID,
|
||||||
|
* and active-open TID tables. The tables themselves are allocated dynamically.
|
||||||
|
*/
|
||||||
|
struct tid_info {
|
||||||
|
void **tid_tab;
|
||||||
|
unsigned int ntids;
|
||||||
|
|
||||||
|
struct serv_entry *stid_tab;
|
||||||
|
unsigned long *stid_bmap;
|
||||||
|
unsigned int nstids;
|
||||||
|
unsigned int stid_base;
|
||||||
|
|
||||||
|
union aopen_entry *atid_tab;
|
||||||
|
unsigned int natids;
|
||||||
|
|
||||||
|
unsigned int nftids;
|
||||||
|
unsigned int ftid_base;
|
||||||
|
|
||||||
|
spinlock_t atid_lock ____cacheline_aligned_in_smp;
|
||||||
|
union aopen_entry *afree;
|
||||||
|
unsigned int atids_in_use;
|
||||||
|
|
||||||
|
spinlock_t stid_lock;
|
||||||
|
unsigned int stids_in_use;
|
||||||
|
|
||||||
|
atomic_t tids_in_use;
|
||||||
|
};
|
||||||
|
|
||||||
|
static inline void *lookup_tid(const struct tid_info *t, unsigned int tid)
|
||||||
|
{
|
||||||
|
return tid < t->ntids ? t->tid_tab[tid] : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void *lookup_atid(const struct tid_info *t, unsigned int atid)
|
||||||
|
{
|
||||||
|
return atid < t->natids ? t->atid_tab[atid].data : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void *lookup_stid(const struct tid_info *t, unsigned int stid)
|
||||||
|
{
|
||||||
|
stid -= t->stid_base;
|
||||||
|
return stid < t->nstids ? t->stid_tab[stid].data : NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void cxgb4_insert_tid(struct tid_info *t, void *data,
|
||||||
|
unsigned int tid)
|
||||||
|
{
|
||||||
|
t->tid_tab[tid] = data;
|
||||||
|
atomic_inc(&t->tids_in_use);
|
||||||
|
}
|
||||||
|
|
||||||
|
int cxgb4_alloc_atid(struct tid_info *t, void *data);
|
||||||
|
int cxgb4_alloc_stid(struct tid_info *t, int family, void *data);
|
||||||
|
void cxgb4_free_atid(struct tid_info *t, unsigned int atid);
|
||||||
|
void cxgb4_free_stid(struct tid_info *t, unsigned int stid, int family);
|
||||||
|
void cxgb4_remove_tid(struct tid_info *t, unsigned int qid, unsigned int tid);
|
||||||
|
void cxgb4_queue_tid_release(struct tid_info *t, unsigned int chan,
|
||||||
|
unsigned int tid);
|
||||||
|
|
||||||
|
struct in6_addr;
|
||||||
|
|
||||||
|
int cxgb4_create_server(const struct net_device *dev, unsigned int stid,
|
||||||
|
__be32 sip, __be16 sport, unsigned int queue);
|
||||||
|
int cxgb4_create_server6(const struct net_device *dev, unsigned int stid,
|
||||||
|
const struct in6_addr *sip, __be16 sport,
|
||||||
|
unsigned int queue);
|
||||||
|
|
||||||
|
static inline void set_wr_txq(struct sk_buff *skb, int prio, int queue)
|
||||||
|
{
|
||||||
|
skb_set_queue_mapping(skb, (queue << 1) | prio);
|
||||||
|
}
|
||||||
|
|
||||||
|
enum cxgb4_uld {
|
||||||
|
CXGB4_ULD_RDMA,
|
||||||
|
CXGB4_ULD_ISCSI,
|
||||||
|
CXGB4_ULD_MAX
|
||||||
|
};
|
||||||
|
|
||||||
|
enum cxgb4_state {
|
||||||
|
CXGB4_STATE_UP,
|
||||||
|
CXGB4_STATE_START_RECOVERY,
|
||||||
|
CXGB4_STATE_DOWN,
|
||||||
|
CXGB4_STATE_DETACH
|
||||||
|
};
|
||||||
|
|
||||||
|
struct pci_dev;
|
||||||
|
struct l2t_data;
|
||||||
|
struct net_device;
|
||||||
|
struct pkt_gl;
|
||||||
|
struct tp_tcp_stats;
|
||||||
|
|
||||||
|
struct cxgb4_range {
|
||||||
|
unsigned int start;
|
||||||
|
unsigned int size;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cxgb4_virt_res { /* virtualized HW resources */
|
||||||
|
struct cxgb4_range ddp;
|
||||||
|
struct cxgb4_range iscsi;
|
||||||
|
struct cxgb4_range stag;
|
||||||
|
struct cxgb4_range rq;
|
||||||
|
struct cxgb4_range pbl;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Block of information the LLD provides to ULDs attaching to a device.
|
||||||
|
*/
|
||||||
|
struct cxgb4_lld_info {
|
||||||
|
struct pci_dev *pdev; /* associated PCI device */
|
||||||
|
struct l2t_data *l2t; /* L2 table */
|
||||||
|
struct tid_info *tids; /* TID table */
|
||||||
|
struct net_device **ports; /* device ports */
|
||||||
|
const struct cxgb4_virt_res *vr; /* assorted HW resources */
|
||||||
|
const unsigned short *mtus; /* MTU table */
|
||||||
|
const unsigned short *rxq_ids; /* the ULD's Rx queue ids */
|
||||||
|
unsigned short nrxq; /* # of Rx queues */
|
||||||
|
unsigned short ntxq; /* # of Tx queues */
|
||||||
|
unsigned char nchan:4; /* # of channels */
|
||||||
|
unsigned char nports:4; /* # of ports */
|
||||||
|
unsigned char wr_cred; /* WR 16-byte credits */
|
||||||
|
unsigned char adapter_type; /* type of adapter */
|
||||||
|
unsigned char fw_api_ver; /* FW API version */
|
||||||
|
unsigned int fw_vers; /* FW version */
|
||||||
|
unsigned int iscsi_iolen; /* iSCSI max I/O length */
|
||||||
|
unsigned short udb_density; /* # of user DB/page */
|
||||||
|
unsigned short ucq_density; /* # of user CQs/page */
|
||||||
|
void __iomem *gts_reg; /* address of GTS register */
|
||||||
|
void __iomem *db_reg; /* address of kernel doorbell */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct cxgb4_uld_info {
|
||||||
|
const char *name;
|
||||||
|
void *(*add)(const struct cxgb4_lld_info *p);
|
||||||
|
int (*rx_handler)(void *handle, const __be64 *rsp,
|
||||||
|
const struct pkt_gl *gl);
|
||||||
|
int (*state_change)(void *handle, enum cxgb4_state new_state);
|
||||||
|
};
|
||||||
|
|
||||||
|
int cxgb4_register_uld(enum cxgb4_uld type, const struct cxgb4_uld_info *p);
|
||||||
|
int cxgb4_unregister_uld(enum cxgb4_uld type);
|
||||||
|
int cxgb4_ofld_send(struct net_device *dev, struct sk_buff *skb);
|
||||||
|
unsigned int cxgb4_port_chan(const struct net_device *dev);
|
||||||
|
unsigned int cxgb4_port_viid(const struct net_device *dev);
|
||||||
|
unsigned int cxgb4_port_idx(const struct net_device *dev);
|
||||||
|
struct net_device *cxgb4_netdev_by_hwid(struct pci_dev *pdev, unsigned int id);
|
||||||
|
unsigned int cxgb4_best_mtu(const unsigned short *mtus, unsigned short mtu,
|
||||||
|
unsigned int *idx);
|
||||||
|
void cxgb4_get_tcp_stats(struct pci_dev *pdev, struct tp_tcp_stats *v4,
|
||||||
|
struct tp_tcp_stats *v6);
|
||||||
|
void cxgb4_iscsi_init(struct net_device *dev, unsigned int tag_mask,
|
||||||
|
const unsigned int *pgsz_order);
|
||||||
|
struct sk_buff *cxgb4_pktgl_to_skb(const struct pkt_gl *gl,
|
||||||
|
unsigned int skb_len, unsigned int pull_len);
|
||||||
|
#endif /* !__CXGB4_OFLD_H */
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,110 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the Chelsio T4 Ethernet driver for Linux.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003-2010 Chelsio Communications, Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is available to you under a choice of one of two
|
||||||
|
* licenses. You may choose to be licensed under the terms of the GNU
|
||||||
|
* General Public License (GPL) Version 2, available from the file
|
||||||
|
* COPYING in the main directory of this source tree, or the
|
||||||
|
* OpenIB.org BSD license below:
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or
|
||||||
|
* without modification, are permitted provided that the following
|
||||||
|
* conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the following
|
||||||
|
* disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following
|
||||||
|
* disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||||
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __CXGB4_L2T_H
|
||||||
|
#define __CXGB4_L2T_H
|
||||||
|
|
||||||
|
#include <linux/spinlock.h>
|
||||||
|
#include <linux/if_ether.h>
|
||||||
|
#include <asm/atomic.h>
|
||||||
|
|
||||||
|
struct adapter;
|
||||||
|
struct l2t_data;
|
||||||
|
struct neighbour;
|
||||||
|
struct net_device;
|
||||||
|
struct file_operations;
|
||||||
|
struct cpl_l2t_write_rpl;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Each L2T entry plays multiple roles. First of all, it keeps state for the
|
||||||
|
* corresponding entry of the HW L2 table and maintains a queue of offload
|
||||||
|
* packets awaiting address resolution. Second, it is a node of a hash table
|
||||||
|
* chain, where the nodes of the chain are linked together through their next
|
||||||
|
* pointer. Finally, each node is a bucket of a hash table, pointing to the
|
||||||
|
* first element in its chain through its first pointer.
|
||||||
|
*/
|
||||||
|
struct l2t_entry {
|
||||||
|
u16 state; /* entry state */
|
||||||
|
u16 idx; /* entry index */
|
||||||
|
u32 addr[4]; /* next hop IP or IPv6 address */
|
||||||
|
int ifindex; /* neighbor's net_device's ifindex */
|
||||||
|
struct neighbour *neigh; /* associated neighbour */
|
||||||
|
struct l2t_entry *first; /* start of hash chain */
|
||||||
|
struct l2t_entry *next; /* next l2t_entry on chain */
|
||||||
|
struct sk_buff *arpq_head; /* queue of packets awaiting resolution */
|
||||||
|
struct sk_buff *arpq_tail;
|
||||||
|
spinlock_t lock;
|
||||||
|
atomic_t refcnt; /* entry reference count */
|
||||||
|
u16 hash; /* hash bucket the entry is on */
|
||||||
|
u16 vlan; /* VLAN TCI (id: bits 0-11, prio: 13-15 */
|
||||||
|
u8 v6; /* whether entry is for IPv6 */
|
||||||
|
u8 lport; /* associated offload logical interface */
|
||||||
|
u8 dmac[ETH_ALEN]; /* neighbour's MAC address */
|
||||||
|
};
|
||||||
|
|
||||||
|
typedef void (*arp_err_handler_t)(void *handle, struct sk_buff *skb);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Callback stored in an skb to handle address resolution failure.
|
||||||
|
*/
|
||||||
|
struct l2t_skb_cb {
|
||||||
|
void *handle;
|
||||||
|
arp_err_handler_t arp_err_handler;
|
||||||
|
};
|
||||||
|
|
||||||
|
#define L2T_SKB_CB(skb) ((struct l2t_skb_cb *)(skb)->cb)
|
||||||
|
|
||||||
|
static inline void t4_set_arp_err_handler(struct sk_buff *skb, void *handle,
|
||||||
|
arp_err_handler_t handler)
|
||||||
|
{
|
||||||
|
L2T_SKB_CB(skb)->handle = handle;
|
||||||
|
L2T_SKB_CB(skb)->arp_err_handler = handler;
|
||||||
|
}
|
||||||
|
|
||||||
|
void cxgb4_l2t_release(struct l2t_entry *e);
|
||||||
|
int cxgb4_l2t_send(struct net_device *dev, struct sk_buff *skb,
|
||||||
|
struct l2t_entry *e);
|
||||||
|
struct l2t_entry *cxgb4_l2t_get(struct l2t_data *d, struct neighbour *neigh,
|
||||||
|
const struct net_device *physdev,
|
||||||
|
unsigned int priority);
|
||||||
|
|
||||||
|
void t4_l2t_update(struct adapter *adap, struct neighbour *neigh);
|
||||||
|
struct l2t_entry *t4_l2t_alloc_switching(struct l2t_data *d);
|
||||||
|
int t4_l2t_set_switching(struct adapter *adap, struct l2t_entry *e, u16 vlan,
|
||||||
|
u8 port, u8 *eth_addr);
|
||||||
|
struct l2t_data *t4_init_l2t(void);
|
||||||
|
void do_l2t_write_rpl(struct adapter *p, const struct cpl_l2t_write_rpl *rpl);
|
||||||
|
|
||||||
|
extern const struct file_operations t4_l2t_fops;
|
||||||
|
#endif /* __CXGB4_L2T_H */
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,100 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of the Chelsio T4 Ethernet driver for Linux.
|
||||||
|
*
|
||||||
|
* Copyright (c) 2003-2010 Chelsio Communications, Inc. All rights reserved.
|
||||||
|
*
|
||||||
|
* This software is available to you under a choice of one of two
|
||||||
|
* licenses. You may choose to be licensed under the terms of the GNU
|
||||||
|
* General Public License (GPL) Version 2, available from the file
|
||||||
|
* COPYING in the main directory of this source tree, or the
|
||||||
|
* OpenIB.org BSD license below:
|
||||||
|
*
|
||||||
|
* Redistribution and use in source and binary forms, with or
|
||||||
|
* without modification, are permitted provided that the following
|
||||||
|
* conditions are met:
|
||||||
|
*
|
||||||
|
* - Redistributions of source code must retain the above
|
||||||
|
* copyright notice, this list of conditions and the following
|
||||||
|
* disclaimer.
|
||||||
|
*
|
||||||
|
* - Redistributions in binary form must reproduce the above
|
||||||
|
* copyright notice, this list of conditions and the following
|
||||||
|
* disclaimer in the documentation and/or other materials
|
||||||
|
* provided with the distribution.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||||
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __T4_HW_H
|
||||||
|
#define __T4_HW_H
|
||||||
|
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
enum {
|
||||||
|
NCHAN = 4, /* # of HW channels */
|
||||||
|
MAX_MTU = 9600, /* max MAC MTU, excluding header + FCS */
|
||||||
|
EEPROMSIZE = 17408, /* Serial EEPROM physical size */
|
||||||
|
EEPROMVSIZE = 32768, /* Serial EEPROM virtual address space size */
|
||||||
|
RSS_NENTRIES = 2048, /* # of entries in RSS mapping table */
|
||||||
|
TCB_SIZE = 128, /* TCB size */
|
||||||
|
NMTUS = 16, /* size of MTU table */
|
||||||
|
NCCTRL_WIN = 32, /* # of congestion control windows */
|
||||||
|
NEXACT_MAC = 336, /* # of exact MAC address filters */
|
||||||
|
L2T_SIZE = 4096, /* # of L2T entries */
|
||||||
|
MBOX_LEN = 64, /* mailbox size in bytes */
|
||||||
|
TRACE_LEN = 112, /* length of trace data and mask */
|
||||||
|
FILTER_OPT_LEN = 36, /* filter tuple width for optional components */
|
||||||
|
NWOL_PAT = 8, /* # of WoL patterns */
|
||||||
|
WOL_PAT_LEN = 128, /* length of WoL patterns */
|
||||||
|
};
|
||||||
|
|
||||||
|
enum {
|
||||||
|
SF_PAGE_SIZE = 256, /* serial flash page size */
|
||||||
|
SF_SEC_SIZE = 64 * 1024, /* serial flash sector size */
|
||||||
|
SF_SIZE = SF_SEC_SIZE * 16, /* serial flash size */
|
||||||
|
};
|
||||||
|
|
||||||
|
enum { RSP_TYPE_FLBUF, RSP_TYPE_CPL, RSP_TYPE_INTR }; /* response entry types */
|
||||||
|
|
||||||
|
enum { MBOX_OWNER_NONE, MBOX_OWNER_FW, MBOX_OWNER_DRV }; /* mailbox owners */
|
||||||
|
|
||||||
|
enum {
|
||||||
|
SGE_MAX_WR_LEN = 512, /* max WR size in bytes */
|
||||||
|
SGE_NTIMERS = 6, /* # of interrupt holdoff timer values */
|
||||||
|
SGE_NCOUNTERS = 4, /* # of interrupt packet counter values */
|
||||||
|
};
|
||||||
|
|
||||||
|
struct sge_qstat { /* data written to SGE queue status entries */
|
||||||
|
__be32 qid;
|
||||||
|
__be16 cidx;
|
||||||
|
__be16 pidx;
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Structure for last 128 bits of response descriptors
|
||||||
|
*/
|
||||||
|
struct rsp_ctrl {
|
||||||
|
__be32 hdrbuflen_pidx;
|
||||||
|
__be32 pldbuflen_qid;
|
||||||
|
union {
|
||||||
|
u8 type_gen;
|
||||||
|
__be64 last_flit;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
#define RSPD_NEWBUF 0x80000000U
|
||||||
|
#define RSPD_LEN 0x7fffffffU
|
||||||
|
|
||||||
|
#define RSPD_GEN(x) ((x) >> 7)
|
||||||
|
#define RSPD_TYPE(x) (((x) >> 4) & 3)
|
||||||
|
|
||||||
|
#define QINTR_CNT_EN 0x1
|
||||||
|
#define QINTR_TIMER_IDX(x) ((x) << 1)
|
||||||
|
#endif /* __T4_HW_H */
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -676,7 +676,7 @@ static int gfar_of_init(struct of_device *ofdev, struct net_device **pdev)
|
|||||||
priv->rx_queue[i] = NULL;
|
priv->rx_queue[i] = NULL;
|
||||||
|
|
||||||
for (i = 0; i < priv->num_tx_queues; i++) {
|
for (i = 0; i < priv->num_tx_queues; i++) {
|
||||||
priv->tx_queue[i] = (struct gfar_priv_tx_q *)kmalloc(
|
priv->tx_queue[i] = (struct gfar_priv_tx_q *)kzalloc(
|
||||||
sizeof (struct gfar_priv_tx_q), GFP_KERNEL);
|
sizeof (struct gfar_priv_tx_q), GFP_KERNEL);
|
||||||
if (!priv->tx_queue[i]) {
|
if (!priv->tx_queue[i]) {
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
@@ -689,7 +689,7 @@ static int gfar_of_init(struct of_device *ofdev, struct net_device **pdev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < priv->num_rx_queues; i++) {
|
for (i = 0; i < priv->num_rx_queues; i++) {
|
||||||
priv->rx_queue[i] = (struct gfar_priv_rx_q *)kmalloc(
|
priv->rx_queue[i] = (struct gfar_priv_rx_q *)kzalloc(
|
||||||
sizeof (struct gfar_priv_rx_q), GFP_KERNEL);
|
sizeof (struct gfar_priv_rx_q), GFP_KERNEL);
|
||||||
if (!priv->rx_queue[i]) {
|
if (!priv->rx_queue[i]) {
|
||||||
err = -ENOMEM;
|
err = -ENOMEM;
|
||||||
@@ -1120,10 +1120,10 @@ static int gfar_probe(struct of_device *ofdev,
|
|||||||
/* provided which set of benchmarks. */
|
/* provided which set of benchmarks. */
|
||||||
printk(KERN_INFO "%s: Running with NAPI enabled\n", dev->name);
|
printk(KERN_INFO "%s: Running with NAPI enabled\n", dev->name);
|
||||||
for (i = 0; i < priv->num_rx_queues; i++)
|
for (i = 0; i < priv->num_rx_queues; i++)
|
||||||
printk(KERN_INFO "%s: :RX BD ring size for Q[%d]: %d\n",
|
printk(KERN_INFO "%s: RX BD ring size for Q[%d]: %d\n",
|
||||||
dev->name, i, priv->rx_queue[i]->rx_ring_size);
|
dev->name, i, priv->rx_queue[i]->rx_ring_size);
|
||||||
for(i = 0; i < priv->num_tx_queues; i++)
|
for(i = 0; i < priv->num_tx_queues; i++)
|
||||||
printk(KERN_INFO "%s:TX BD ring size for Q[%d]: %d\n",
|
printk(KERN_INFO "%s: TX BD ring size for Q[%d]: %d\n",
|
||||||
dev->name, i, priv->tx_queue[i]->tx_ring_size);
|
dev->name, i, priv->tx_queue[i]->tx_ring_size);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
@@ -1638,13 +1638,13 @@ static void free_skb_resources(struct gfar_private *priv)
|
|||||||
/* Go through all the buffer descriptors and free their data buffers */
|
/* Go through all the buffer descriptors and free their data buffers */
|
||||||
for (i = 0; i < priv->num_tx_queues; i++) {
|
for (i = 0; i < priv->num_tx_queues; i++) {
|
||||||
tx_queue = priv->tx_queue[i];
|
tx_queue = priv->tx_queue[i];
|
||||||
if(!tx_queue->tx_skbuff)
|
if(tx_queue->tx_skbuff)
|
||||||
free_skb_tx_queue(tx_queue);
|
free_skb_tx_queue(tx_queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (i = 0; i < priv->num_rx_queues; i++) {
|
for (i = 0; i < priv->num_rx_queues; i++) {
|
||||||
rx_queue = priv->rx_queue[i];
|
rx_queue = priv->rx_queue[i];
|
||||||
if(!rx_queue->rx_skbuff)
|
if(rx_queue->rx_skbuff)
|
||||||
free_skb_rx_queue(rx_queue);
|
free_skb_rx_queue(rx_queue);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -493,13 +493,14 @@ static int pcmcia_get_versmac(struct pcmcia_device *p_dev,
|
|||||||
{
|
{
|
||||||
struct net_device *dev = priv;
|
struct net_device *dev = priv;
|
||||||
cisparse_t parse;
|
cisparse_t parse;
|
||||||
|
u8 *buf;
|
||||||
|
|
||||||
if (pcmcia_parse_tuple(tuple, &parse))
|
if (pcmcia_parse_tuple(tuple, &parse))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if ((parse.version_1.ns > 3) &&
|
buf = parse.version_1.str + parse.version_1.ofs[3];
|
||||||
(cvt_ascii_address(dev,
|
|
||||||
(parse.version_1.str + parse.version_1.ofs[3]))))
|
if ((parse.version_1.ns > 3) && (cvt_ascii_address(dev, buf) == 0))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
@@ -528,7 +529,7 @@ static int mhz_setup(struct pcmcia_device *link)
|
|||||||
len = pcmcia_get_tuple(link, 0x81, &buf);
|
len = pcmcia_get_tuple(link, 0x81, &buf);
|
||||||
if (buf && len >= 13) {
|
if (buf && len >= 13) {
|
||||||
buf[12] = '\0';
|
buf[12] = '\0';
|
||||||
if (cvt_ascii_address(dev, buf))
|
if (cvt_ascii_address(dev, buf) == 0)
|
||||||
rc = 0;
|
rc = 0;
|
||||||
}
|
}
|
||||||
kfree(buf);
|
kfree(buf);
|
||||||
@@ -910,7 +911,7 @@ static int smc91c92_config(struct pcmcia_device *link)
|
|||||||
|
|
||||||
if (i != 0) {
|
if (i != 0) {
|
||||||
printk(KERN_NOTICE "smc91c92_cs: Unable to find hardware address.\n");
|
printk(KERN_NOTICE "smc91c92_cs: Unable to find hardware address.\n");
|
||||||
goto config_undo;
|
goto config_failed;
|
||||||
}
|
}
|
||||||
|
|
||||||
smc->duplex = 0;
|
smc->duplex = 0;
|
||||||
@@ -998,6 +999,7 @@ config_undo:
|
|||||||
unregister_netdev(dev);
|
unregister_netdev(dev);
|
||||||
config_failed:
|
config_failed:
|
||||||
smc91c92_release(link);
|
smc91c92_release(link);
|
||||||
|
free_netdev(dev);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
} /* smc91c92_config */
|
} /* smc91c92_config */
|
||||||
|
|
||||||
|
|||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user