mirror of
https://github.com/linux-msm/laptops-kernel.git
synced 2026-08-13 14:19:53 -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: (66 commits) be2net: fix some cmds to use mccq instead of mbox atl1e: fix 2.6.31-git4 -- ATL1E 0000:03:00.0: DMA-API: device driver frees DMA pkt_sched: Fix qstats.qlen updating in dump_stats ipv6: Log the affected address when DAD failure occurs wl12xx: Fix print_mac() conversion. af_iucv: fix race when queueing skbs on the backlog queue af_iucv: do not call iucv_sock_kill() twice af_iucv: handle non-accepted sockets after resuming from suspend af_iucv: fix race in __iucv_sock_wait() iucv: use correct output register in iucv_query_maxconn() iucv: fix iucv_buffer_cpumask check when calling IUCV functions iucv: suspend/resume error msg for left over pathes wl12xx: switch to %pM to print the mac address b44: the poll handler b44_poll must not enable IRQ unconditionally ipv6: Ignore route option with ROUTER_PREF_INVALID bonding: make ab_arp select active slaves as other modes cfg80211: fix SME connect rc80211_minstrel: fix contention window calculation ssb/sdio: fix printk format warnings p54usb: add Zcomax XG-705A usbid ...
This commit is contained in:
commit
f205ce83a7
132 files changed
+2012
-808
No files matched your search
@@ -377,10 +377,19 @@ struct atl1e_hw {
|
||||
*/
|
||||
struct atl1e_tx_buffer {
|
||||
struct sk_buff *skb;
|
||||
u16 flags;
|
||||
#define ATL1E_TX_PCIMAP_SINGLE 0x0001
|
||||
#define ATL1E_TX_PCIMAP_PAGE 0x0002
|
||||
#define ATL1E_TX_PCIMAP_TYPE_MASK 0x0003
|
||||
u16 length;
|
||||
dma_addr_t dma;
|
||||
};
|
||||
|
||||
#define ATL1E_SET_PCIMAP_TYPE(tx_buff, type) do { \
|
||||
((tx_buff)->flags) &= ~ATL1E_TX_PCIMAP_TYPE_MASK; \
|
||||
((tx_buff)->flags) |= (type); \
|
||||
} while (0)
|
||||
|
||||
struct atl1e_rx_page {
|
||||
dma_addr_t dma; /* receive rage DMA address */
|
||||
u8 *addr; /* receive rage virtual address */
|
||||
|
||||
@@ -635,7 +635,11 @@ static void atl1e_clean_tx_ring(struct atl1e_adapter *adapter)
|
||||
for (index = 0; index < ring_count; index++) {
|
||||
tx_buffer = &tx_ring->tx_buffer[index];
|
||||
if (tx_buffer->dma) {
|
||||
pci_unmap_page(pdev, tx_buffer->dma,
|
||||
if (tx_buffer->flags & ATL1E_TX_PCIMAP_SINGLE)
|
||||
pci_unmap_single(pdev, tx_buffer->dma,
|
||||
tx_buffer->length, PCI_DMA_TODEVICE);
|
||||
else if (tx_buffer->flags & ATL1E_TX_PCIMAP_PAGE)
|
||||
pci_unmap_page(pdev, tx_buffer->dma,
|
||||
tx_buffer->length, PCI_DMA_TODEVICE);
|
||||
tx_buffer->dma = 0;
|
||||
}
|
||||
@@ -1220,7 +1224,11 @@ static bool atl1e_clean_tx_irq(struct atl1e_adapter *adapter)
|
||||
while (next_to_clean != hw_next_to_clean) {
|
||||
tx_buffer = &tx_ring->tx_buffer[next_to_clean];
|
||||
if (tx_buffer->dma) {
|
||||
pci_unmap_page(adapter->pdev, tx_buffer->dma,
|
||||
if (tx_buffer->flags & ATL1E_TX_PCIMAP_SINGLE)
|
||||
pci_unmap_single(adapter->pdev, tx_buffer->dma,
|
||||
tx_buffer->length, PCI_DMA_TODEVICE);
|
||||
else if (tx_buffer->flags & ATL1E_TX_PCIMAP_PAGE)
|
||||
pci_unmap_page(adapter->pdev, tx_buffer->dma,
|
||||
tx_buffer->length, PCI_DMA_TODEVICE);
|
||||
tx_buffer->dma = 0;
|
||||
}
|
||||
@@ -1741,6 +1749,7 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter,
|
||||
tx_buffer->length = map_len;
|
||||
tx_buffer->dma = pci_map_single(adapter->pdev,
|
||||
skb->data, hdr_len, PCI_DMA_TODEVICE);
|
||||
ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_SINGLE);
|
||||
mapped_len += map_len;
|
||||
use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma);
|
||||
use_tpd->word2 = (use_tpd->word2 & (~TPD_BUFLEN_MASK)) |
|
||||
@@ -1766,6 +1775,7 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter,
|
||||
tx_buffer->dma =
|
||||
pci_map_single(adapter->pdev, skb->data + mapped_len,
|
||||
map_len, PCI_DMA_TODEVICE);
|
||||
ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_SINGLE);
|
||||
mapped_len += map_len;
|
||||
use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma);
|
||||
use_tpd->word2 = (use_tpd->word2 & (~TPD_BUFLEN_MASK)) |
|
||||
@@ -1801,6 +1811,7 @@ static void atl1e_tx_map(struct atl1e_adapter *adapter,
|
||||
(i * MAX_TX_BUF_LEN),
|
||||
tx_buffer->length,
|
||||
PCI_DMA_TODEVICE);
|
||||
ATL1E_SET_PCIMAP_TYPE(tx_buffer, ATL1E_TX_PCIMAP_PAGE);
|
||||
use_tpd->buffer_addr = cpu_to_le64(tx_buffer->dma);
|
||||
use_tpd->word2 = (use_tpd->word2 & (~TPD_BUFLEN_MASK)) |
|
||||
((cpu_to_le32(tx_buffer->length) &
|
||||
|
||||
+3
-4
@@ -847,23 +847,22 @@ static int b44_poll(struct napi_struct *napi, int budget)
|
||||
{
|
||||
struct b44 *bp = container_of(napi, struct b44, napi);
|
||||
int work_done;
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irq(&bp->lock);
|
||||
spin_lock_irqsave(&bp->lock, flags);
|
||||
|
||||
if (bp->istat & (ISTAT_TX | ISTAT_TO)) {
|
||||
/* spin_lock(&bp->tx_lock); */
|
||||
b44_tx(bp);
|
||||
/* spin_unlock(&bp->tx_lock); */
|
||||
}
|
||||
spin_unlock_irq(&bp->lock);
|
||||
spin_unlock_irqrestore(&bp->lock, flags);
|
||||
|
||||
work_done = 0;
|
||||
if (bp->istat & ISTAT_RX)
|
||||
work_done += b44_rx(bp, budget);
|
||||
|
||||
if (bp->istat & ISTAT_ERRORS) {
|
||||
unsigned long flags;
|
||||
|
||||
spin_lock_irqsave(&bp->lock, flags);
|
||||
b44_halt(bp);
|
||||
b44_init_rings(bp);
|
||||
|
||||
@@ -362,5 +362,6 @@ static inline u8 is_udp_pkt(struct sk_buff *skb)
|
||||
extern void be_cq_notify(struct be_adapter *adapter, u16 qid, bool arm,
|
||||
u16 num_popped);
|
||||
extern void be_link_status_update(struct be_adapter *adapter, bool link_up);
|
||||
extern void netdev_stats_update(struct be_adapter *adapter);
|
||||
extern int be_load_fw(struct be_adapter *adapter, u8 *func);
|
||||
#endif /* BE_H */
|
||||
+246
-166
File diff suppressed because it is too large.
Load diff
@@ -61,7 +61,8 @@ enum {
|
||||
/* The command is completing because the queue was getting flushed */
|
||||
MCC_STATUS_QUEUE_FLUSHING = 0x4,
|
||||
/* The command is completing with a DMA error */
|
||||
MCC_STATUS_DMA_FAILED = 0x5
|
||||
MCC_STATUS_DMA_FAILED = 0x5,
|
||||
MCC_STATUS_NOT_SUPPORTED = 0x66
|
||||
};
|
||||
|
||||
#define CQE_STATUS_COMPL_MASK 0xFFFF
|
||||
@@ -761,7 +762,7 @@ extern int be_cmd_get_flow_control(struct be_adapter *adapter,
|
||||
u32 *tx_fc, u32 *rx_fc);
|
||||
extern int be_cmd_query_fw_cfg(struct be_adapter *adapter, u32 *port_num);
|
||||
extern int be_cmd_reset_function(struct be_adapter *adapter);
|
||||
extern void be_process_mcc(struct be_adapter *adapter);
|
||||
extern int be_process_mcc(struct be_adapter *adapter);
|
||||
extern int be_cmd_write_flashrom(struct be_adapter *adapter,
|
||||
struct be_dma_mem *cmd, u32 flash_oper,
|
||||
u32 flash_opcode, u32 buf_size);
|
||||
+21
-21
@@ -135,7 +135,7 @@ static int be_mac_addr_set(struct net_device *netdev, void *p)
|
||||
return status;
|
||||
}
|
||||
|
||||
static void netdev_stats_update(struct be_adapter *adapter)
|
||||
void netdev_stats_update(struct be_adapter *adapter)
|
||||
{
|
||||
struct be_hw_stats *hw_stats = hw_stats_from_cmd(adapter->stats.cmd.va);
|
||||
struct be_rxf_stats *rxf_stats = &hw_stats->rxf;
|
||||
@@ -431,8 +431,7 @@ static int make_tx_wrbs(struct be_adapter *adapter,
|
||||
}
|
||||
|
||||
static netdev_tx_t be_xmit(struct sk_buff *skb,
|
||||
struct net_device *netdev)
|
||||
|
||||
struct net_device *netdev)
|
||||
{
|
||||
struct be_adapter *adapter = netdev_priv(netdev);
|
||||
struct be_tx_obj *tx_obj = &adapter->tx_obj;
|
||||
@@ -490,11 +489,11 @@ static int be_change_mtu(struct net_device *netdev, int new_mtu)
|
||||
* program them in BE. If more than BE_NUM_VLANS_SUPPORTED are configured,
|
||||
* set the BE in promiscuous VLAN mode.
|
||||
*/
|
||||
static void be_vid_config(struct net_device *netdev)
|
||||
static int be_vid_config(struct be_adapter *adapter)
|
||||
{
|
||||
struct be_adapter *adapter = netdev_priv(netdev);
|
||||
u16 vtag[BE_NUM_VLANS_SUPPORTED];
|
||||
u16 ntags = 0, i;
|
||||
int status;
|
||||
|
||||
if (adapter->num_vlans <= BE_NUM_VLANS_SUPPORTED) {
|
||||
/* Construct VLAN Table to give to HW */
|
||||
@@ -504,12 +503,13 @@ static void be_vid_config(struct net_device *netdev)
|
||||
ntags++;
|
||||
}
|
||||
}
|
||||
be_cmd_vlan_config(adapter, adapter->if_handle,
|
||||
vtag, ntags, 1, 0);
|
||||
status = be_cmd_vlan_config(adapter, adapter->if_handle,
|
||||
vtag, ntags, 1, 0);
|
||||
} else {
|
||||
be_cmd_vlan_config(adapter, adapter->if_handle,
|
||||
NULL, 0, 1, 1);
|
||||
status = be_cmd_vlan_config(adapter, adapter->if_handle,
|
||||
NULL, 0, 1, 1);
|
||||
}
|
||||
return status;
|
||||
}
|
||||
|
||||
static void be_vlan_register(struct net_device *netdev, struct vlan_group *grp)
|
||||
@@ -532,7 +532,7 @@ static void be_vlan_add_vid(struct net_device *netdev, u16 vid)
|
||||
adapter->num_vlans++;
|
||||
adapter->vlan_tag[vid] = 1;
|
||||
|
||||
be_vid_config(netdev);
|
||||
be_vid_config(adapter);
|
||||
}
|
||||
|
||||
static void be_vlan_rem_vid(struct net_device *netdev, u16 vid)
|
||||
@@ -543,7 +543,7 @@ static void be_vlan_rem_vid(struct net_device *netdev, u16 vid)
|
||||
adapter->vlan_tag[vid] = 0;
|
||||
|
||||
vlan_group_set_device(adapter->vlan_grp, vid, NULL);
|
||||
be_vid_config(netdev);
|
||||
be_vid_config(adapter);
|
||||
}
|
||||
|
||||
static void be_set_multicast_list(struct net_device *netdev)
|
||||
@@ -1444,12 +1444,8 @@ static void be_worker(struct work_struct *work)
|
||||
{
|
||||
struct be_adapter *adapter =
|
||||
container_of(work, struct be_adapter, work.work);
|
||||
int status;
|
||||
|
||||
/* Get Stats */
|
||||
status = be_cmd_get_stats(adapter, &adapter->stats.cmd);
|
||||
if (!status)
|
||||
netdev_stats_update(adapter);
|
||||
be_cmd_get_stats(adapter, &adapter->stats.cmd);
|
||||
|
||||
/* Set EQ delay */
|
||||
be_rx_eqd_update(adapter);
|
||||
@@ -1622,11 +1618,6 @@ static int be_setup(struct be_adapter *adapter)
|
||||
if (status != 0)
|
||||
goto do_none;
|
||||
|
||||
be_vid_config(netdev);
|
||||
|
||||
status = be_cmd_set_flow_control(adapter, true, true);
|
||||
if (status != 0)
|
||||
goto if_destroy;
|
||||
|
||||
status = be_tx_queues_create(adapter);
|
||||
if (status != 0)
|
||||
@@ -1640,8 +1631,17 @@ static int be_setup(struct be_adapter *adapter)
|
||||
if (status != 0)
|
||||
goto rx_qs_destroy;
|
||||
|
||||
status = be_vid_config(adapter);
|
||||
if (status != 0)
|
||||
goto mccqs_destroy;
|
||||
|
||||
status = be_cmd_set_flow_control(adapter, true, true);
|
||||
if (status != 0)
|
||||
goto mccqs_destroy;
|
||||
return 0;
|
||||
|
||||
mccqs_destroy:
|
||||
be_mcc_queues_destroy(adapter);
|
||||
rx_qs_destroy:
|
||||
be_rx_queues_destroy(adapter);
|
||||
tx_qs_destroy:
|
||||
|
||||
@@ -1093,15 +1093,8 @@ static struct slave *bond_find_best_slave(struct bonding *bond)
|
||||
return NULL; /* still no slave, return NULL */
|
||||
}
|
||||
|
||||
/*
|
||||
* first try the primary link; if arping, a link must tx/rx
|
||||
* traffic before it can be considered the curr_active_slave.
|
||||
* also, we would skip slaves between the curr_active_slave
|
||||
* and primary_slave that may be up and able to arp
|
||||
*/
|
||||
if ((bond->primary_slave) &&
|
||||
(!bond->params.arp_interval) &&
|
||||
(IS_UP(bond->primary_slave->dev))) {
|
||||
bond->primary_slave->link == BOND_LINK_UP) {
|
||||
new_active = bond->primary_slave;
|
||||
}
|
||||
|
||||
@@ -1109,15 +1102,14 @@ static struct slave *bond_find_best_slave(struct bonding *bond)
|
||||
old_active = new_active;
|
||||
|
||||
bond_for_each_slave_from(bond, new_active, i, old_active) {
|
||||
if (IS_UP(new_active->dev)) {
|
||||
if (new_active->link == BOND_LINK_UP) {
|
||||
return new_active;
|
||||
} else if (new_active->link == BOND_LINK_BACK) {
|
||||
/* link up, but waiting for stabilization */
|
||||
if (new_active->delay < mintime) {
|
||||
mintime = new_active->delay;
|
||||
bestslave = new_active;
|
||||
}
|
||||
if (new_active->link == BOND_LINK_UP) {
|
||||
return new_active;
|
||||
} else if (new_active->link == BOND_LINK_BACK &&
|
||||
IS_UP(new_active->dev)) {
|
||||
/* link up, but waiting for stabilization */
|
||||
if (new_active->delay < mintime) {
|
||||
mintime = new_active->delay;
|
||||
bestslave = new_active;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1211,7 +1203,7 @@ void bond_change_active_slave(struct bonding *bond, struct slave *new_active)
|
||||
write_unlock_bh(&bond->curr_slave_lock);
|
||||
read_unlock(&bond->lock);
|
||||
|
||||
netdev_bonding_change(bond->dev);
|
||||
netdev_bonding_change(bond->dev, NETDEV_BONDING_FAILOVER);
|
||||
|
||||
read_lock(&bond->lock);
|
||||
write_lock_bh(&bond->curr_slave_lock);
|
||||
@@ -1469,14 +1461,17 @@ int bond_enslave(struct net_device *bond_dev, struct net_device *slave_dev)
|
||||
*/
|
||||
if (bond->slave_cnt == 0) {
|
||||
if (bond_dev->type != slave_dev->type) {
|
||||
dev_close(bond_dev);
|
||||
pr_debug("%s: change device type from %d to %d\n",
|
||||
bond_dev->name, bond_dev->type, slave_dev->type);
|
||||
|
||||
netdev_bonding_change(bond_dev, NETDEV_BONDING_OLDTYPE);
|
||||
|
||||
if (slave_dev->type != ARPHRD_ETHER)
|
||||
bond_setup_by_slave(bond_dev, slave_dev);
|
||||
else
|
||||
ether_setup(bond_dev);
|
||||
dev_open(bond_dev);
|
||||
|
||||
netdev_bonding_change(bond_dev, NETDEV_BONDING_NEWTYPE);
|
||||
}
|
||||
} else if (bond_dev->type != slave_dev->type) {
|
||||
pr_err(DRV_NAME ": %s ether type (%d) is different "
|
||||
@@ -2929,18 +2924,6 @@ static int bond_ab_arp_inspect(struct bonding *bond, int delta_in_ticks)
|
||||
}
|
||||
}
|
||||
|
||||
read_lock(&bond->curr_slave_lock);
|
||||
|
||||
/*
|
||||
* Trigger a commit if the primary option setting has changed.
|
||||
*/
|
||||
if (bond->primary_slave &&
|
||||
(bond->primary_slave != bond->curr_active_slave) &&
|
||||
(bond->primary_slave->link == BOND_LINK_UP))
|
||||
commit++;
|
||||
|
||||
read_unlock(&bond->curr_slave_lock);
|
||||
|
||||
return commit;
|
||||
}
|
||||
|
||||
@@ -2961,90 +2944,58 @@ static void bond_ab_arp_commit(struct bonding *bond, int delta_in_ticks)
|
||||
continue;
|
||||
|
||||
case BOND_LINK_UP:
|
||||
write_lock_bh(&bond->curr_slave_lock);
|
||||
|
||||
if (!bond->curr_active_slave &&
|
||||
time_before_eq(jiffies, dev_trans_start(slave->dev) +
|
||||
delta_in_ticks)) {
|
||||
if ((!bond->curr_active_slave &&
|
||||
time_before_eq(jiffies,
|
||||
dev_trans_start(slave->dev) +
|
||||
delta_in_ticks)) ||
|
||||
bond->curr_active_slave != slave) {
|
||||
slave->link = BOND_LINK_UP;
|
||||
bond_change_active_slave(bond, slave);
|
||||
bond->current_arp_slave = NULL;
|
||||
|
||||
pr_info(DRV_NAME
|
||||
": %s: %s is up and now the "
|
||||
"active interface\n",
|
||||
bond->dev->name, slave->dev->name);
|
||||
": %s: link status definitely "
|
||||
"up for interface %s.\n",
|
||||
bond->dev->name, slave->dev->name);
|
||||
|
||||
} else if (bond->curr_active_slave != slave) {
|
||||
/* this slave has just come up but we
|
||||
* already have a current slave; this can
|
||||
* also happen if bond_enslave adds a new
|
||||
* slave that is up while we are searching
|
||||
* for a new slave
|
||||
*/
|
||||
slave->link = BOND_LINK_UP;
|
||||
bond_set_slave_inactive_flags(slave);
|
||||
bond->current_arp_slave = NULL;
|
||||
if (!bond->curr_active_slave ||
|
||||
(slave == bond->primary_slave))
|
||||
goto do_failover;
|
||||
|
||||
pr_info(DRV_NAME
|
||||
": %s: backup interface %s is now up\n",
|
||||
bond->dev->name, slave->dev->name);
|
||||
}
|
||||
|
||||
write_unlock_bh(&bond->curr_slave_lock);
|
||||
|
||||
break;
|
||||
continue;
|
||||
|
||||
case BOND_LINK_DOWN:
|
||||
if (slave->link_failure_count < UINT_MAX)
|
||||
slave->link_failure_count++;
|
||||
|
||||
slave->link = BOND_LINK_DOWN;
|
||||
bond_set_slave_inactive_flags(slave);
|
||||
|
||||
pr_info(DRV_NAME
|
||||
": %s: link status definitely down for "
|
||||
"interface %s, disabling it\n",
|
||||
bond->dev->name, slave->dev->name);
|
||||
|
||||
if (slave == bond->curr_active_slave) {
|
||||
pr_info(DRV_NAME
|
||||
": %s: link status down for active "
|
||||
"interface %s, disabling it\n",
|
||||
bond->dev->name, slave->dev->name);
|
||||
|
||||
bond_set_slave_inactive_flags(slave);
|
||||
|
||||
write_lock_bh(&bond->curr_slave_lock);
|
||||
|
||||
bond_select_active_slave(bond);
|
||||
if (bond->curr_active_slave)
|
||||
bond->curr_active_slave->jiffies =
|
||||
jiffies;
|
||||
|
||||
write_unlock_bh(&bond->curr_slave_lock);
|
||||
|
||||
bond->current_arp_slave = NULL;
|
||||
|
||||
} else if (slave->state == BOND_STATE_BACKUP) {
|
||||
pr_info(DRV_NAME
|
||||
": %s: backup interface %s is now down\n",
|
||||
bond->dev->name, slave->dev->name);
|
||||
|
||||
bond_set_slave_inactive_flags(slave);
|
||||
goto do_failover;
|
||||
}
|
||||
break;
|
||||
|
||||
continue;
|
||||
|
||||
default:
|
||||
pr_err(DRV_NAME
|
||||
": %s: impossible: new_link %d on slave %s\n",
|
||||
bond->dev->name, slave->new_link,
|
||||
slave->dev->name);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* No race with changes to primary via sysfs, as we hold rtnl.
|
||||
*/
|
||||
if (bond->primary_slave &&
|
||||
(bond->primary_slave != bond->curr_active_slave) &&
|
||||
(bond->primary_slave->link == BOND_LINK_UP)) {
|
||||
do_failover:
|
||||
ASSERT_RTNL();
|
||||
write_lock_bh(&bond->curr_slave_lock);
|
||||
bond_change_active_slave(bond, bond->primary_slave);
|
||||
bond_select_active_slave(bond);
|
||||
write_unlock_bh(&bond->curr_slave_lock);
|
||||
}
|
||||
|
||||
|
||||
@@ -80,7 +80,7 @@ static void vcan_rx(struct sk_buff *skb, struct net_device *dev)
|
||||
skb->dev = dev;
|
||||
skb->ip_summed = CHECKSUM_UNNECESSARY;
|
||||
|
||||
netif_rx(skb);
|
||||
netif_rx_ni(skb);
|
||||
}
|
||||
|
||||
static netdev_tx_t vcan_tx(struct sk_buff *skb, struct net_device *dev)
|
||||
|
||||
+91
-105
@@ -49,11 +49,10 @@ static s32 igb_read_phy_reg_sgmii_82575(struct e1000_hw *, u32, u16 *);
|
||||
static s32 igb_reset_hw_82575(struct e1000_hw *);
|
||||
static s32 igb_set_d0_lplu_state_82575(struct e1000_hw *, bool);
|
||||
static s32 igb_setup_copper_link_82575(struct e1000_hw *);
|
||||
static s32 igb_setup_fiber_serdes_link_82575(struct e1000_hw *);
|
||||
static s32 igb_setup_serdes_link_82575(struct e1000_hw *);
|
||||
static s32 igb_write_phy_reg_sgmii_82575(struct e1000_hw *, u32, u16);
|
||||
static void igb_clear_hw_cntrs_82575(struct e1000_hw *);
|
||||
static s32 igb_acquire_swfw_sync_82575(struct e1000_hw *, u16);
|
||||
static void igb_configure_pcs_link_82575(struct e1000_hw *);
|
||||
static s32 igb_get_pcs_speed_and_duplex_82575(struct e1000_hw *, u16 *,
|
||||
u16 *);
|
||||
static s32 igb_get_phy_id_82575(struct e1000_hw *);
|
||||
@@ -105,16 +104,20 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw)
|
||||
dev_spec->sgmii_active = false;
|
||||
|
||||
ctrl_ext = rd32(E1000_CTRL_EXT);
|
||||
if ((ctrl_ext & E1000_CTRL_EXT_LINK_MODE_MASK) ==
|
||||
E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES) {
|
||||
hw->phy.media_type = e1000_media_type_internal_serdes;
|
||||
ctrl_ext |= E1000_CTRL_I2C_ENA;
|
||||
} else if (ctrl_ext & E1000_CTRL_EXT_LINK_MODE_SGMII) {
|
||||
switch (ctrl_ext & E1000_CTRL_EXT_LINK_MODE_MASK) {
|
||||
case E1000_CTRL_EXT_LINK_MODE_SGMII:
|
||||
dev_spec->sgmii_active = true;
|
||||
ctrl_ext |= E1000_CTRL_I2C_ENA;
|
||||
} else {
|
||||
break;
|
||||
case E1000_CTRL_EXT_LINK_MODE_PCIE_SERDES:
|
||||
hw->phy.media_type = e1000_media_type_internal_serdes;
|
||||
ctrl_ext |= E1000_CTRL_I2C_ENA;
|
||||
break;
|
||||
default:
|
||||
ctrl_ext &= ~E1000_CTRL_I2C_ENA;
|
||||
break;
|
||||
}
|
||||
|
||||
wr32(E1000_CTRL_EXT, ctrl_ext);
|
||||
|
||||
/* Set mta register count */
|
||||
@@ -134,7 +137,7 @@ static s32 igb_get_invariants_82575(struct e1000_hw *hw)
|
||||
mac->ops.setup_physical_interface =
|
||||
(hw->phy.media_type == e1000_media_type_copper)
|
||||
? igb_setup_copper_link_82575
|
||||
: igb_setup_fiber_serdes_link_82575;
|
||||
: igb_setup_serdes_link_82575;
|
||||
|
||||
/* NVM initialization */
|
||||
eecd = rd32(E1000_EECD);
|
||||
@@ -379,6 +382,7 @@ static s32 igb_get_phy_id_82575(struct e1000_hw *hw)
|
||||
struct e1000_phy_info *phy = &hw->phy;
|
||||
s32 ret_val = 0;
|
||||
u16 phy_id;
|
||||
u32 ctrl_ext;
|
||||
|
||||
/*
|
||||
* For SGMII PHYs, we try the list of possible addresses until
|
||||
@@ -393,6 +397,12 @@ static s32 igb_get_phy_id_82575(struct e1000_hw *hw)
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Power on sgmii phy if it is disabled */
|
||||
ctrl_ext = rd32(E1000_CTRL_EXT);
|
||||
wr32(E1000_CTRL_EXT, ctrl_ext & ~E1000_CTRL_EXT_SDP3_DATA);
|
||||
wrfl();
|
||||
msleep(300);
|
||||
|
||||
/*
|
||||
* The address field in the I2CCMD register is 3 bits and 0 is invalid.
|
||||
* Therefore, we need to test 1-7
|
||||
@@ -418,9 +428,12 @@ static s32 igb_get_phy_id_82575(struct e1000_hw *hw)
|
||||
phy->addr = 0;
|
||||
ret_val = -E1000_ERR_PHY;
|
||||
goto out;
|
||||
} else {
|
||||
ret_val = igb_get_phy_id(hw);
|
||||
}
|
||||
|
||||
ret_val = igb_get_phy_id(hw);
|
||||
/* restore previous sfp cage power state */
|
||||
wr32(E1000_CTRL_EXT, ctrl_ext);
|
||||
|
||||
out:
|
||||
return ret_val;
|
||||
@@ -766,17 +779,18 @@ static s32 igb_get_pcs_speed_and_duplex_82575(struct e1000_hw *hw, u16 *speed,
|
||||
}
|
||||
|
||||
/**
|
||||
* igb_shutdown_fiber_serdes_link_82575 - Remove link during power down
|
||||
* igb_shutdown_serdes_link_82575 - Remove link during power down
|
||||
* @hw: pointer to the HW structure
|
||||
*
|
||||
* In the case of fiber serdes, shut down optics and PCS on driver unload
|
||||
* when management pass thru is not enabled.
|
||||
**/
|
||||
void igb_shutdown_fiber_serdes_link_82575(struct e1000_hw *hw)
|
||||
void igb_shutdown_serdes_link_82575(struct e1000_hw *hw)
|
||||
{
|
||||
u32 reg;
|
||||
|
||||
if (hw->phy.media_type != e1000_media_type_internal_serdes)
|
||||
if (hw->phy.media_type != e1000_media_type_internal_serdes ||
|
||||
igb_sgmii_active_82575(hw))
|
||||
return;
|
||||
|
||||
/* if the management interface is not enabled, then power down */
|
||||
@@ -788,7 +802,7 @@ void igb_shutdown_fiber_serdes_link_82575(struct e1000_hw *hw)
|
||||
|
||||
/* shutdown the laser */
|
||||
reg = rd32(E1000_CTRL_EXT);
|
||||
reg |= E1000_CTRL_EXT_SDP7_DATA;
|
||||
reg |= E1000_CTRL_EXT_SDP3_DATA;
|
||||
wr32(E1000_CTRL_EXT, reg);
|
||||
|
||||
/* flush the write to verify completion */
|
||||
@@ -927,6 +941,17 @@ static s32 igb_setup_copper_link_82575(struct e1000_hw *hw)
|
||||
ctrl &= ~(E1000_CTRL_FRCSPD | E1000_CTRL_FRCDPX);
|
||||
wr32(E1000_CTRL, ctrl);
|
||||
|
||||
ret_val = igb_setup_serdes_link_82575(hw);
|
||||
if (ret_val)
|
||||
goto out;
|
||||
|
||||
if (igb_sgmii_active_82575(hw) && !hw->phy.reset_disable) {
|
||||
ret_val = hw->phy.ops.reset(hw);
|
||||
if (ret_val) {
|
||||
hw_dbg("Error resetting the PHY.\n");
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
switch (hw->phy.type) {
|
||||
case e1000_phy_m88:
|
||||
ret_val = igb_copper_link_setup_m88(hw);
|
||||
@@ -963,8 +988,6 @@ static s32 igb_setup_copper_link_82575(struct e1000_hw *hw)
|
||||
}
|
||||
}
|
||||
|
||||
igb_configure_pcs_link_82575(hw);
|
||||
|
||||
/*
|
||||
* Check link status. Wait up to 100 microseconds for link to become
|
||||
* valid.
|
||||
@@ -987,14 +1010,18 @@ out:
|
||||
}
|
||||
|
||||
/**
|
||||
* igb_setup_fiber_serdes_link_82575 - Setup link for fiber/serdes
|
||||
* igb_setup_serdes_link_82575 - Setup link for fiber/serdes
|
||||
* @hw: pointer to the HW structure
|
||||
*
|
||||
* Configures speed and duplex for fiber and serdes links.
|
||||
**/
|
||||
static s32 igb_setup_fiber_serdes_link_82575(struct e1000_hw *hw)
|
||||
static s32 igb_setup_serdes_link_82575(struct e1000_hw *hw)
|
||||
{
|
||||
u32 reg;
|
||||
u32 ctrl_reg, reg;
|
||||
|
||||
if ((hw->phy.media_type != e1000_media_type_internal_serdes) &&
|
||||
!igb_sgmii_active_82575(hw))
|
||||
return 0;
|
||||
|
||||
/*
|
||||
* On the 82575, SerDes loopback mode persists until it is
|
||||
@@ -1004,26 +1031,38 @@ static s32 igb_setup_fiber_serdes_link_82575(struct e1000_hw *hw)
|
||||
*/
|
||||
wr32(E1000_SCTL, E1000_SCTL_DISABLE_SERDES_LOOPBACK);
|
||||
|
||||
/* Force link up, set 1gb, set both sw defined pins */
|
||||
reg = rd32(E1000_CTRL);
|
||||
reg |= E1000_CTRL_SLU |
|
||||
E1000_CTRL_SPD_1000 |
|
||||
E1000_CTRL_FRCSPD |
|
||||
E1000_CTRL_SWDPIN0 |
|
||||
E1000_CTRL_SWDPIN1;
|
||||
wr32(E1000_CTRL, reg);
|
||||
/* power on the sfp cage if present */
|
||||
reg = rd32(E1000_CTRL_EXT);
|
||||
reg &= ~E1000_CTRL_EXT_SDP3_DATA;
|
||||
wr32(E1000_CTRL_EXT, reg);
|
||||
|
||||
/* Power on phy for 82576 fiber adapters */
|
||||
if (hw->mac.type == e1000_82576) {
|
||||
reg = rd32(E1000_CTRL_EXT);
|
||||
reg &= ~E1000_CTRL_EXT_SDP7_DATA;
|
||||
wr32(E1000_CTRL_EXT, reg);
|
||||
ctrl_reg = rd32(E1000_CTRL);
|
||||
ctrl_reg |= E1000_CTRL_SLU;
|
||||
|
||||
if (hw->mac.type == e1000_82575 || hw->mac.type == e1000_82576) {
|
||||
/* set both sw defined pins */
|
||||
ctrl_reg |= E1000_CTRL_SWDPIN0 | E1000_CTRL_SWDPIN1;
|
||||
|
||||
/* Set switch control to serdes energy detect */
|
||||
reg = rd32(E1000_CONNSW);
|
||||
reg |= E1000_CONNSW_ENRGSRC;
|
||||
wr32(E1000_CONNSW, reg);
|
||||
}
|
||||
|
||||
/* Set switch control to serdes energy detect */
|
||||
reg = rd32(E1000_CONNSW);
|
||||
reg |= E1000_CONNSW_ENRGSRC;
|
||||
wr32(E1000_CONNSW, reg);
|
||||
reg = rd32(E1000_PCS_LCTL);
|
||||
|
||||
if (igb_sgmii_active_82575(hw)) {
|
||||
/* allow time for SFP cage to power up phy */
|
||||
msleep(300);
|
||||
|
||||
/* AN time out should be disabled for SGMII mode */
|
||||
reg &= ~(E1000_PCS_LCTL_AN_TIMEOUT);
|
||||
} else {
|
||||
ctrl_reg |= E1000_CTRL_SPD_1000 | E1000_CTRL_FRCSPD |
|
||||
E1000_CTRL_FD | E1000_CTRL_FRCDPX;
|
||||
}
|
||||
|
||||
wr32(E1000_CTRL, ctrl_reg);
|
||||
|
||||
/*
|
||||
* New SerDes mode allows for forcing speed or autonegotiating speed
|
||||
@@ -1031,12 +1070,21 @@ static s32 igb_setup_fiber_serdes_link_82575(struct e1000_hw *hw)
|
||||
* mode that will be compatible with older link partners and switches.
|
||||
* However, both are supported by the hardware and some drivers/tools.
|
||||
*/
|
||||
reg = rd32(E1000_PCS_LCTL);
|
||||
|
||||
reg &= ~(E1000_PCS_LCTL_AN_ENABLE | E1000_PCS_LCTL_FLV_LINK_UP |
|
||||
E1000_PCS_LCTL_FSD | E1000_PCS_LCTL_FORCE_LINK);
|
||||
|
||||
if (hw->mac.autoneg) {
|
||||
/*
|
||||
* We force flow control to prevent the CTRL register values from being
|
||||
* overwritten by the autonegotiated flow control values
|
||||
*/
|
||||
reg |= E1000_PCS_LCTL_FORCE_FCTRL;
|
||||
|
||||
/*
|
||||
* we always set sgmii to autoneg since it is the phy that will be
|
||||
* forcing the link and the serdes is just a go-between
|
||||
*/
|
||||
if (hw->mac.autoneg || igb_sgmii_active_82575(hw)) {
|
||||
/* Set PCS register for autoneg */
|
||||
reg |= E1000_PCS_LCTL_FSV_1000 | /* Force 1000 */
|
||||
E1000_PCS_LCTL_FDV_FULL | /* SerDes Full duplex */
|
||||
@@ -1053,77 +1101,14 @@ static s32 igb_setup_fiber_serdes_link_82575(struct e1000_hw *hw)
|
||||
hw_dbg("Configuring Forced Link; PCS_LCTL = 0x%08X\n", reg);
|
||||
}
|
||||
|
||||
if (hw->mac.type == e1000_82576) {
|
||||
reg |= E1000_PCS_LCTL_FORCE_FCTRL;
|
||||
igb_force_mac_fc(hw);
|
||||
}
|
||||
|
||||
wr32(E1000_PCS_LCTL, reg);
|
||||
|
||||
if (!igb_sgmii_active_82575(hw))
|
||||
igb_force_mac_fc(hw);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* igb_configure_pcs_link_82575 - Configure PCS link
|
||||
* @hw: pointer to the HW structure
|
||||
*
|
||||
* Configure the physical coding sub-layer (PCS) link. The PCS link is
|
||||
* only used on copper connections where the serialized gigabit media
|
||||
* independent interface (sgmii) is being used. Configures the link
|
||||
* for auto-negotiation or forces speed/duplex.
|
||||
**/
|
||||
static void igb_configure_pcs_link_82575(struct e1000_hw *hw)
|
||||
{
|
||||
struct e1000_mac_info *mac = &hw->mac;
|
||||
u32 reg = 0;
|
||||
|
||||
if (hw->phy.media_type != e1000_media_type_copper ||
|
||||
!(igb_sgmii_active_82575(hw)))
|
||||
return;
|
||||
|
||||
/* For SGMII, we need to issue a PCS autoneg restart */
|
||||
reg = rd32(E1000_PCS_LCTL);
|
||||
|
||||
/* AN time out should be disabled for SGMII mode */
|
||||
reg &= ~(E1000_PCS_LCTL_AN_TIMEOUT);
|
||||
|
||||
if (mac->autoneg) {
|
||||
/* Make sure forced speed and force link are not set */
|
||||
reg &= ~(E1000_PCS_LCTL_FSD | E1000_PCS_LCTL_FORCE_LINK);
|
||||
|
||||
/*
|
||||
* The PHY should be setup prior to calling this function.
|
||||
* All we need to do is restart autoneg and enable autoneg.
|
||||
*/
|
||||
reg |= E1000_PCS_LCTL_AN_RESTART | E1000_PCS_LCTL_AN_ENABLE;
|
||||
} else {
|
||||
/* Set PCS register for forced speed */
|
||||
|
||||
/* Turn off bits for full duplex, speed, and autoneg */
|
||||
reg &= ~(E1000_PCS_LCTL_FSV_1000 |
|
||||
E1000_PCS_LCTL_FSV_100 |
|
||||
E1000_PCS_LCTL_FDV_FULL |
|
||||
E1000_PCS_LCTL_AN_ENABLE);
|
||||
|
||||
/* Check for duplex first */
|
||||
if (mac->forced_speed_duplex & E1000_ALL_FULL_DUPLEX)
|
||||
reg |= E1000_PCS_LCTL_FDV_FULL;
|
||||
|
||||
/* Now set speed */
|
||||
if (mac->forced_speed_duplex & E1000_ALL_100_SPEED)
|
||||
reg |= E1000_PCS_LCTL_FSV_100;
|
||||
|
||||
/* Force speed and force link */
|
||||
reg |= E1000_PCS_LCTL_FSD |
|
||||
E1000_PCS_LCTL_FORCE_LINK |
|
||||
E1000_PCS_LCTL_FLV_LINK_UP;
|
||||
|
||||
hw_dbg("Wrote 0x%08X to PCS_LCTL to configure forced link\n",
|
||||
reg);
|
||||
}
|
||||
wr32(E1000_PCS_LCTL, reg);
|
||||
}
|
||||
|
||||
/**
|
||||
* igb_sgmii_active_82575 - Return sgmii state
|
||||
* @hw: pointer to the HW structure
|
||||
@@ -1248,7 +1233,8 @@ static void igb_clear_hw_cntrs_82575(struct e1000_hw *hw)
|
||||
temp = rd32(E1000_LENERRS);
|
||||
|
||||
/* This register should not be read in copper configurations */
|
||||
if (hw->phy.media_type == e1000_media_type_internal_serdes)
|
||||
if (hw->phy.media_type == e1000_media_type_internal_serdes ||
|
||||
igb_sgmii_active_82575(hw))
|
||||
temp = rd32(E1000_SCVPC);
|
||||
}
|
||||
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
#ifndef _E1000_82575_H_
|
||||
#define _E1000_82575_H_
|
||||
|
||||
extern void igb_shutdown_fiber_serdes_link_82575(struct e1000_hw *hw);
|
||||
extern void igb_shutdown_serdes_link_82575(struct e1000_hw *hw);
|
||||
extern void igb_rx_fifo_flush_82575(struct e1000_hw *hw);
|
||||
|
||||
#define ID_LED_DEFAULT_82575_SERDES ((ID_LED_DEF1_DEF2 << 12) | \
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
#define E1000_WUFC_BC 0x00000010 /* Broadcast Wakeup Enable */
|
||||
|
||||
/* Extended Device Control */
|
||||
#define E1000_CTRL_EXT_SDP7_DATA 0x00000080 /* Value of SW Defineable Pin 7 */
|
||||
#define E1000_CTRL_EXT_SDP3_DATA 0x00000080 /* Value of SW Defineable Pin 3 */
|
||||
/* Physical Func Reset Done Indication */
|
||||
#define E1000_CTRL_EXT_PFRSTD 0x00004000
|
||||
#define E1000_CTRL_EXT_LINK_MODE_MASK 0x00C00000
|
||||
|
||||
@@ -1565,9 +1565,12 @@ out:
|
||||
**/
|
||||
s32 igb_phy_sw_reset(struct e1000_hw *hw)
|
||||
{
|
||||
s32 ret_val;
|
||||
s32 ret_val = 0;
|
||||
u16 phy_ctrl;
|
||||
|
||||
if (!(hw->phy.ops.read_reg))
|
||||
goto out;
|
||||
|
||||
ret_val = hw->phy.ops.read_reg(hw, PHY_CONTROL, &phy_ctrl);
|
||||
if (ret_val)
|
||||
goto out;
|
||||
|
||||
@@ -5320,7 +5320,7 @@ static int __igb_shutdown(struct pci_dev *pdev, bool *enable_wake)
|
||||
|
||||
*enable_wake = wufc || adapter->en_mng_pt;
|
||||
if (!*enable_wake)
|
||||
igb_shutdown_fiber_serdes_link_82575(hw);
|
||||
igb_shutdown_serdes_link_82575(hw);
|
||||
|
||||
/* Release control of h/w to f/w. If f/w is AMT enabled, this
|
||||
* would have already happened in close and is redundant. */
|
||||
|
||||
@@ -322,14 +322,16 @@ static enum ixgbe_media_type ixgbe_get_media_type_82598(struct ixgbe_hw *hw)
|
||||
break;
|
||||
case IXGBE_DEV_ID_82598AF_DUAL_PORT:
|
||||
case IXGBE_DEV_ID_82598AF_SINGLE_PORT:
|
||||
case IXGBE_DEV_ID_82598EB_CX4:
|
||||
case IXGBE_DEV_ID_82598_CX4_DUAL_PORT:
|
||||
case IXGBE_DEV_ID_82598_DA_DUAL_PORT:
|
||||
case IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM:
|
||||
case IXGBE_DEV_ID_82598EB_XF_LR:
|
||||
case IXGBE_DEV_ID_82598EB_SFP_LOM:
|
||||
media_type = ixgbe_media_type_fiber;
|
||||
break;
|
||||
case IXGBE_DEV_ID_82598EB_CX4:
|
||||
case IXGBE_DEV_ID_82598_CX4_DUAL_PORT:
|
||||
media_type = ixgbe_media_type_cx4;
|
||||
break;
|
||||
case IXGBE_DEV_ID_82598AT:
|
||||
case IXGBE_DEV_ID_82598AT2:
|
||||
media_type = ixgbe_media_type_copper;
|
||||
|
||||
@@ -337,6 +337,9 @@ static enum ixgbe_media_type ixgbe_get_media_type_82599(struct ixgbe_hw *hw)
|
||||
case IXGBE_DEV_ID_82599_SFP:
|
||||
media_type = ixgbe_media_type_fiber;
|
||||
break;
|
||||
case IXGBE_DEV_ID_82599_CX4:
|
||||
media_type = ixgbe_media_type_cx4;
|
||||
break;
|
||||
default:
|
||||
media_type = ixgbe_media_type_unknown;
|
||||
break;
|
||||
|
||||
@@ -97,6 +97,8 @@ static struct pci_device_id ixgbe_pci_tbl[] = {
|
||||
board_82599 },
|
||||
{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_SFP),
|
||||
board_82599 },
|
||||
{PCI_VDEVICE(INTEL, IXGBE_DEV_ID_82599_CX4),
|
||||
board_82599 },
|
||||
|
||||
/* required last entry */
|
||||
{0, }
|
||||
@@ -2055,6 +2057,8 @@ static void ixgbe_configure_rx(struct ixgbe_adapter *adapter)
|
||||
|
||||
if (adapter->flags & IXGBE_FLAG_RX_PS_ENABLED)
|
||||
rx_ring->flags |= IXGBE_RING_RX_PS_ENABLED;
|
||||
else
|
||||
rx_ring->flags &= ~IXGBE_RING_RX_PS_ENABLED;
|
||||
|
||||
#ifdef IXGBE_FCOE
|
||||
if (netdev->features & NETIF_F_FCOE_MTU) {
|
||||
|
||||
@@ -49,6 +49,7 @@
|
||||
#define IXGBE_DEV_ID_82598_SR_DUAL_PORT_EM 0x10E1
|
||||
#define IXGBE_DEV_ID_82598EB_XF_LR 0x10F4
|
||||
#define IXGBE_DEV_ID_82599_KX4 0x10F7
|
||||
#define IXGBE_DEV_ID_82599_CX4 0x10F9
|
||||
#define IXGBE_DEV_ID_82599_SFP 0x10FB
|
||||
#define IXGBE_DEV_ID_82599_XAUI_LOM 0x10FC
|
||||
|
||||
@@ -2143,6 +2144,7 @@ enum ixgbe_media_type {
|
||||
ixgbe_media_type_fiber,
|
||||
ixgbe_media_type_copper,
|
||||
ixgbe_media_type_backplane,
|
||||
ixgbe_media_type_cx4,
|
||||
ixgbe_media_type_virtual
|
||||
};
|
||||
|
||||
|
||||
@@ -96,12 +96,17 @@ static void catas_reset(struct work_struct *work)
|
||||
spin_unlock_irq(&catas_lock);
|
||||
|
||||
list_for_each_entry_safe(priv, tmppriv, &tlist, catas_err.list) {
|
||||
struct pci_dev *pdev = priv->dev.pdev;
|
||||
|
||||
ret = mlx4_restart_one(priv->dev.pdev);
|
||||
dev = &priv->dev;
|
||||
/* 'priv' now is not valid */
|
||||
if (ret)
|
||||
mlx4_err(dev, "Reset failed (%d)\n", ret);
|
||||
else
|
||||
printk(KERN_ERR "mlx4 %s: Reset failed (%d)\n",
|
||||
pci_name(pdev), ret);
|
||||
else {
|
||||
dev = pci_get_drvdata(pdev);
|
||||
mlx4_dbg(dev, "Reset succeeded\n");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -1750,11 +1750,11 @@ static struct pcmcia_device_id pcnet_ids[] = {
|
||||
PCMCIA_DEVICE_PROD_ID2("EN-6200P2", 0xa996d078),
|
||||
/* too generic! */
|
||||
/* PCMCIA_DEVICE_PROD_ID12("PCMCIA", "10/100 Ethernet Card", 0x281f1c5d, 0x11b0ffc0), */
|
||||
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "PCMCIA", "EN2218-LAN/MODEM", 0x281f1c5d, 0x570f348e, "PCMLM28.cis"),
|
||||
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "PCMCIA", "UE2218-LAN/MODEM", 0x281f1c5d, 0x6fdcacee, "PCMLM28.cis"),
|
||||
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "PCMLM28.cis"),
|
||||
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "PCMLM28.cis"),
|
||||
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "PCMLM28.cis"),
|
||||
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "PCMCIA", "EN2218-LAN/MODEM", 0x281f1c5d, 0x570f348e, "cis/PCMLM28.cis"),
|
||||
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "PCMCIA", "UE2218-LAN/MODEM", 0x281f1c5d, 0x6fdcacee, "cis/PCMLM28.cis"),
|
||||
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet", 0xf5f025c2, 0x338e8155, "cis/PCMLM28.cis"),
|
||||
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "Psion Dacom", "Gold Card V34 Ethernet GSM", 0xf5f025c2, 0x4ae85d35, "cis/PCMLM28.cis"),
|
||||
PCMCIA_PFC_DEVICE_CIS_PROD_ID12(0, "LINKSYS", "PCMLM28", 0xf7cb0b07, 0x66881874, "cis/PCMLM28.cis"),
|
||||
PCMCIA_MFC_DEVICE_CIS_PROD_ID12(0, "DAYNA COMMUNICATIONS", "LAN AND MODEM MULTIFUNCTION", 0x8fdf8f89, 0xdd5ed9e8, "DP83903.cis"),
|
||||
PCMCIA_MFC_DEVICE_CIS_PROD_ID4(0, "NSC MF LAN/Modem", 0x58fc6056, "DP83903.cis"),
|
||||
PCMCIA_MFC_DEVICE_CIS_MANF_CARD(0, 0x0175, 0x0000, "DP83903.cis"),
|
||||
|
||||
Loaded 20 of 132 files, more files were not shown because too many files have changed in this diff.
Show more
Reference in new issue
Block a user