* Re: [PATCH] bonding: various fixes for bonding, netpoll & netconsole (v2)
From: Flavio Leitner @ 2010-10-15 23:41 UTC (permalink / raw)
To: nhorman; +Cc: netdev, bonding-devel, fubar, davem, andy, amwang
In-Reply-To: <1286973334-4339-1-git-send-email-nhorman@tuxdriver.com>
On Wed, Oct 13, 2010 at 08:35:29AM -0400, nhorman@tuxdriver.com wrote:
> Version 2, taking teh following changes into account:
>
> 1) Moved tx blocking/checking macros to netpoll.h as suggested by amwang
>
> 2) Added tx blocking macro calls to sysfs paths, as they can deadlock in the
> same way that the link monitoring paths can.
>
> Summary:
> A while ago we tried to enable netpoll on the bonding driver to enable
> netconsole. That worked well in a steady state, but deadlocked frequently in
> failover conditions due to some recursive lock-taking (as well as a few other
> problems). I've gone through the driver, netconsole and netpoll code, fixed up
> those deadlocks, and confirmed that, with this patch series, we can use
> netconsole on bonding without deadlock in all bonding modes with all slaves,
> even accross failovers. I've also fixed up some incidental bugs that I ran
> across while looking through this code, as described in individual patches
>
> Signed-off-by: Neil Horman <nhorman@tuxdriver.com>
I've tested these patch series and found this:
netconsole: network logging started
bonding: bond0: making interface eth0 the new active one.
------------[ cut here ]------------
WARNING: at kernel/softirq.c:143 _local_bh_enable_ip+0x4e/0xd7()
Hardware name: Precision WorkStation 490
Modules linked in: netconsole configfs sunrpc bonding ip6t_REJECT
nf_conntrack_ipv6 ip6table_filter ip6_tables ipv6 p4_clockmod freq_table
speedstep_lib dm_multipath uinput snd_hda_codec_idt snd_hda_intel
snd_hda_codec snd_hwdep snd_seq snd_seq_device i5k_amb snd_pcm hwmon
i5000_edac snd_timer edac_core e1000 snd ppdev parport_pc iTCO_wdt
parport iTCO_vendor_support soundcore tg3 dcdbas pcspkr shpchp i2c_i801
serio_raw snd_page_alloc nouveau ttm drm_kms_helper drm i2c_algo_bit
video output i2c_core [last unloaded: netconsole]
Pid: 8, comm: kworker/1:0 Not tainted 2.6.36-rc7+ #26
Call Trace:
[<ffffffff810510c5>] warn_slowpath_common+0x85/0x9d
[<ffffffff813cfcf2>] ? rcu_read_unlock_bh+0x26/0x28
[<ffffffff810510f7>] warn_slowpath_null+0x1a/0x1c
[<ffffffff810574fa>] _local_bh_enable_ip+0x4e/0xd7
[<ffffffff810575a5>] local_bh_enable+0x12/0x14 <-- enabling again
[<ffffffff813cfcf2>] rcu_read_unlock_bh+0x26/0x28
[<ffffffff813d08a1>] dev_queue_xmit+0x363/0x375
[<ffffffff813d053e>] ? dev_queue_xmit+0x0/0x375
[<ffffffffa028c1e0>] bond_dev_queue_xmit+0xbe/0xdb [bonding]
[<ffffffffa028c46e>] bond_start_xmit+0x271/0x4df [bonding]
[<ffffffff813e0a15>] queue_process+0xcd/0x18a <- interrupts disabled
[<ffffffff813e0948>] ? queue_process+0x0/0x18a
[<ffffffff810673cf>] process_one_work+0x216/0x37d
[<ffffffff81067344>] ? process_one_work+0x18b/0x37d
[<ffffffff8106920d>] ? manage_workers+0x10b/0x195
[<ffffffff810693d8>] worker_thread+0x141/0x21e
[<ffffffff81069297>] ? worker_thread+0x0/0x21e
[<ffffffff8106c988>] kthread+0x9d/0xa5
[<ffffffff8100aaa4>] kernel_thread_helper+0x4/0x10
[<ffffffff8147f950>] ? restore_args+0x0/0x30
[<ffffffff8106c8eb>] ? kthread+0x0/0xa5
[<ffffffff8100aaa0>] ? kernel_thread_helper+0x0/0x10
---[ end trace 55688f5173e9b393 ]---
e1000: eth1 NIC Link is Up 1000 Mbps Full Duplex, Flow Control: RX/TX
bonding: bond0: link status definitely up for interface eth1.
0)
It happens because queue_process() disables the local
interrupts before call ->ndo_start_xmit() and then
dev_queue_xmit() will enable them back.
I have CONFIG_TRACE_IRQFLAGS=y on my .config.
--
Flavio
^ permalink raw reply
* Re: [PATCH 2/3] cxgb4: function namespace cleanup
From: Dimitris Michailidis @ 2010-10-15 23:34 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: Divy Le Ray, David S. Miller, Casey Leedom, netdev
In-Reply-To: <20101015224523.633775810@vyatta.com>
Stephen Hemminger wrote:
> Make functions only used in one file local.
> Remove lots of dead code. Most surprising is the function
> cxgb4_iscsi_init which is defined but never called!
> Compile tested only
You are changing to static or removing entirely functions exported for use
by the iSCSI and RDMA drivers. The function you mention, cxgb4_iscsi_init,
is used in the cxgb4i driver in the scsi tree and this change breaks it.
>
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
>
>
> ---
> drivers/net/cxgb4/cxgb4.h | 17 -
> drivers/net/cxgb4/cxgb4_main.c | 91 ---------
> drivers/net/cxgb4/cxgb4_uld.h | 12 -
> drivers/net/cxgb4/l2t.c | 34 ---
> drivers/net/cxgb4/l2t.h | 3
> drivers/net/cxgb4/sge.c | 5
> drivers/net/cxgb4/t4_hw.c | 394 -----------------------------------------
> 7 files changed, 5 insertions(+), 551 deletions(-)
>
> --- a/drivers/net/cxgb4/cxgb4_main.c 2010-10-15 11:31:38.980766681 -0700
> +++ b/drivers/net/cxgb4/cxgb4_main.c 2010-10-15 11:40:13.976943486 -0700
> @@ -880,7 +880,7 @@ void *t4_alloc_mem(size_t size)
> /*
> * Free memory allocated through alloc_mem().
> */
> -void t4_free_mem(void *addr)
> +static void t4_free_mem(void *addr)
> {
> if (is_vmalloc_addr(addr))
> vfree(addr);
> @@ -2206,8 +2206,8 @@ static void mk_tid_release(struct sk_buf
> * Queue a TID release request and if necessary schedule a work queue to
> * process it.
> */
> -void cxgb4_queue_tid_release(struct tid_info *t, unsigned int chan,
> - unsigned int tid)
> +static void cxgb4_queue_tid_release(struct tid_info *t, unsigned int chan,
> + unsigned int tid)
> {
> void **p = &t->tid_tab[tid];
> struct adapter *adap = container_of(t, struct adapter, tids);
> @@ -2222,7 +2222,6 @@ void cxgb4_queue_tid_release(struct tid_
> }
> spin_unlock_bh(&adap->tid_release_lock);
> }
> -EXPORT_SYMBOL(cxgb4_queue_tid_release);
>
> /*
> * Process the list of pending TID release requests.
> @@ -2355,48 +2354,6 @@ int cxgb4_create_server(const struct net
> EXPORT_SYMBOL(cxgb4_create_server);
>
> /**
> - * cxgb4_create_server6 - create an IPv6 server
> - * @dev: the device
> - * @stid: the server TID
> - * @sip: local IPv6 address to bind server to
> - * @sport: the server's TCP port
> - * @queue: queue to direct messages from this server to
> - *
> - * Create an IPv6 server for the given port and address.
> - * Returns <0 on error and one of the %NET_XMIT_* values on success.
> - */
> -int cxgb4_create_server6(const struct net_device *dev, unsigned int stid,
> - const struct in6_addr *sip, __be16 sport,
> - unsigned int queue)
> -{
> - unsigned int chan;
> - struct sk_buff *skb;
> - struct adapter *adap;
> - struct cpl_pass_open_req6 *req;
> -
> - skb = alloc_skb(sizeof(*req), GFP_KERNEL);
> - if (!skb)
> - return -ENOMEM;
> -
> - adap = netdev2adap(dev);
> - req = (struct cpl_pass_open_req6 *)__skb_put(skb, sizeof(*req));
> - INIT_TP_WR(req, 0);
> - OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_PASS_OPEN_REQ6, stid));
> - req->local_port = sport;
> - req->peer_port = htons(0);
> - req->local_ip_hi = *(__be64 *)(sip->s6_addr);
> - req->local_ip_lo = *(__be64 *)(sip->s6_addr + 8);
> - req->peer_ip_hi = cpu_to_be64(0);
> - req->peer_ip_lo = cpu_to_be64(0);
> - chan = rxq_to_chan(&adap->sge, queue);
> - req->opt0 = cpu_to_be64(TX_CHAN(chan));
> - req->opt1 = cpu_to_be64(CONN_POLICY_ASK |
> - SYN_RSS_ENABLE | SYN_RSS_QUEUE(queue));
> - return t4_mgmt_tx(adap, skb);
> -}
> -EXPORT_SYMBOL(cxgb4_create_server6);
> -
> -/**
> * cxgb4_best_mtu - find the entry in the MTU table closest to an MTU
> * @mtus: the HW MTU table
> * @mtu: the target MTU
> @@ -2455,48 +2412,6 @@ unsigned int cxgb4_port_idx(const struct
> }
> EXPORT_SYMBOL(cxgb4_port_idx);
>
> -/**
> - * cxgb4_netdev_by_hwid - return the net device of a HW port
> - * @pdev: identifies the adapter
> - * @id: the HW port id
> - *
> - * Return the net device associated with the interface with the given HW
> - * id.
> - */
> -struct net_device *cxgb4_netdev_by_hwid(struct pci_dev *pdev, unsigned int id)
> -{
> - const struct adapter *adap = pci_get_drvdata(pdev);
> -
> - if (!adap || id >= NCHAN)
> - return NULL;
> - id = adap->chan_map[id];
> - return id < MAX_NPORTS ? adap->port[id] : NULL;
> -}
> -EXPORT_SYMBOL(cxgb4_netdev_by_hwid);
> -
> -void cxgb4_get_tcp_stats(struct pci_dev *pdev, struct tp_tcp_stats *v4,
> - struct tp_tcp_stats *v6)
> -{
> - struct adapter *adap = pci_get_drvdata(pdev);
> -
> - spin_lock(&adap->stats_lock);
> - t4_tp_get_tcp_stats(adap, v4, v6);
> - spin_unlock(&adap->stats_lock);
> -}
> -EXPORT_SYMBOL(cxgb4_get_tcp_stats);
> -
> -void cxgb4_iscsi_init(struct net_device *dev, unsigned int tag_mask,
> - const unsigned int *pgsz_order)
> -{
> - struct adapter *adap = netdev2adap(dev);
> -
> - t4_write_reg(adap, ULP_RX_ISCSI_TAGMASK, tag_mask);
> - t4_write_reg(adap, ULP_RX_ISCSI_PSZ, HPZ0(pgsz_order[0]) |
> - HPZ1(pgsz_order[1]) | HPZ2(pgsz_order[2]) |
> - HPZ3(pgsz_order[3]));
> -}
> -EXPORT_SYMBOL(cxgb4_iscsi_init);
> -
> static struct pci_driver cxgb4_driver;
>
> static void check_neigh_update(struct neighbour *neigh)
> --- a/drivers/net/cxgb4/cxgb4_uld.h 2010-10-15 11:31:38.964766089 -0700
> +++ b/drivers/net/cxgb4/cxgb4_uld.h 2010-10-15 11:39:06.777878706 -0700
> @@ -139,16 +139,11 @@ int cxgb4_alloc_stid(struct tid_info *t,
> 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)
> {
> @@ -233,13 +228,6 @@ int cxgb4_ofld_send(struct net_device *d
> 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 */
> --- a/drivers/net/cxgb4/cxgb4.h 2010-10-15 11:40:02.748431897 -0700
> +++ b/drivers/net/cxgb4/cxgb4.h 2010-10-15 11:46:18.685455254 -0700
> @@ -592,7 +592,6 @@ void t4_os_portmod_changed(const struct
> void t4_os_link_changed(struct adapter *adap, int port_id, int link_stat);
>
> void *t4_alloc_mem(size_t size);
> -void t4_free_mem(void *addr);
>
> void t4_free_sge_resources(struct adapter *adap);
> irq_handler_t t4_intr_handler(struct adapter *adap);
> @@ -651,7 +650,6 @@ static inline int t4_wr_mbox_ns(struct a
>
> void t4_intr_enable(struct adapter *adapter);
> void t4_intr_disable(struct adapter *adapter);
> -void t4_intr_clear(struct adapter *adapter);
> int t4_slow_intr_handler(struct adapter *adapter);
>
> int t4_wait_dev_ready(struct adapter *adap);
> @@ -664,26 +662,16 @@ int t4_check_fw_version(struct adapter *
> int t4_prep_adapter(struct adapter *adapter);
> int t4_port_init(struct adapter *adap, int mbox, int pf, int vf);
> void t4_fatal_err(struct adapter *adapter);
> -int t4_set_trace_filter(struct adapter *adapter, const struct trace_params *tp,
> - int filter_index, int enable);
> -void t4_get_trace_filter(struct adapter *adapter, struct trace_params *tp,
> - int filter_index, int *enabled);
> int t4_config_rss_range(struct adapter *adapter, int mbox, unsigned int viid,
> int start, int n, const u16 *rspq, unsigned int nrspq);
> int t4_config_glbl_rss(struct adapter *adapter, int mbox, unsigned int mode,
> unsigned int flags);
> -int t4_read_rss(struct adapter *adapter, u16 *entries);
> int t4_mc_read(struct adapter *adap, u32 addr, __be32 *data, u64 *parity);
> int t4_edc_read(struct adapter *adap, int idx, u32 addr, __be32 *data,
> u64 *parity);
>
> void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p);
> -void t4_get_lb_stats(struct adapter *adap, int idx, struct lb_port_stats *p);
> -
> void t4_read_mtu_tbl(struct adapter *adap, u16 *mtus, u8 *mtu_log);
> -void t4_tp_get_err_stats(struct adapter *adap, struct tp_err_stats *st);
> -void t4_tp_get_tcp_stats(struct adapter *adap, struct tp_tcp_stats *v4,
> - struct tp_tcp_stats *v6);
> void t4_load_mtus(struct adapter *adap, const unsigned short *mtus,
> const unsigned short *alpha, const unsigned short *beta);
>
> @@ -711,8 +699,6 @@ int t4_cfg_pfvf(struct adapter *adap, un
> int t4_alloc_vi(struct adapter *adap, unsigned int mbox, unsigned int port,
> unsigned int pf, unsigned int vf, unsigned int nmac, u8 *mac,
> unsigned int *rss_size);
> -int t4_free_vi(struct adapter *adap, unsigned int mbox, unsigned int pf,
> - unsigned int vf, unsigned int viid);
> int t4_set_rxmode(struct adapter *adap, unsigned int mbox, unsigned int viid,
> int mtu, int promisc, int all_multi, int bcast, int vlanex,
> bool sleep_ok);
> @@ -731,9 +717,6 @@ int t4_mdio_rd(struct adapter *adap, uns
> unsigned int mmd, unsigned int reg, u16 *valp);
> int t4_mdio_wr(struct adapter *adap, unsigned int mbox, unsigned int phy_addr,
> unsigned int mmd, unsigned int reg, u16 val);
> -int t4_iq_start_stop(struct adapter *adap, unsigned int mbox, bool start,
> - unsigned int pf, unsigned int vf, unsigned int iqid,
> - unsigned int fl0id, unsigned int fl1id);
> int t4_iq_free(struct adapter *adap, unsigned int mbox, unsigned int pf,
> unsigned int vf, unsigned int iqtype, unsigned int iqid,
> unsigned int fl0id, unsigned int fl1id);
> --- a/drivers/net/cxgb4/l2t.c 2010-10-15 11:33:43.549387836 -0700
> +++ b/drivers/net/cxgb4/l2t.c 2010-10-15 11:33:55.949849920 -0700
> @@ -481,40 +481,6 @@ void t4_l2t_update(struct adapter *adap,
> handle_failed_resolution(adap, arpq);
> }
>
> -/*
> - * Allocate an L2T entry for use by a switching rule. Such entries need to be
> - * explicitly freed and while busy they are not on any hash chain, so normal
> - * address resolution updates do not see them.
> - */
> -struct l2t_entry *t4_l2t_alloc_switching(struct l2t_data *d)
> -{
> - struct l2t_entry *e;
> -
> - write_lock_bh(&d->lock);
> - e = alloc_l2e(d);
> - if (e) {
> - spin_lock(&e->lock); /* avoid race with t4_l2t_free */
> - e->state = L2T_STATE_SWITCHING;
> - atomic_set(&e->refcnt, 1);
> - spin_unlock(&e->lock);
> - }
> - write_unlock_bh(&d->lock);
> - return e;
> -}
> -
> -/*
> - * Sets/updates the contents of a switching L2T entry that has been allocated
> - * with an earlier call to @t4_l2t_alloc_switching.
> - */
> -int t4_l2t_set_switching(struct adapter *adap, struct l2t_entry *e, u16 vlan,
> - u8 port, u8 *eth_addr)
> -{
> - e->vlan = vlan;
> - e->lport = port;
> - memcpy(e->dmac, eth_addr, ETH_ALEN);
> - return write_l2e(adap, e, 0);
> -}
> -
> struct l2t_data *t4_init_l2t(void)
> {
> int i;
> --- a/drivers/net/cxgb4/l2t.h 2010-10-15 11:33:00.175774482 -0700
> +++ b/drivers/net/cxgb4/l2t.h 2010-10-15 11:33:13.728278102 -0700
> @@ -100,9 +100,6 @@ struct l2t_entry *cxgb4_l2t_get(struct l
> 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);
>
> --- a/drivers/net/cxgb4/sge.c 2010-10-15 11:34:06.486242828 -0700
> +++ b/drivers/net/cxgb4/sge.c 2010-10-15 11:34:41.967567863 -0700
> @@ -1434,8 +1434,8 @@ static inline void copy_frags(struct skb
> * Builds an sk_buff from the given packet gather list. Returns the
> * sk_buff or %NULL if sk_buff allocation failed.
> */
> -struct sk_buff *cxgb4_pktgl_to_skb(const struct pkt_gl *gl,
> - unsigned int skb_len, unsigned int pull_len)
> +static struct sk_buff *cxgb4_pktgl_to_skb(const struct pkt_gl *gl,
> + unsigned int skb_len, unsigned int pull_len)
> {
> struct sk_buff *skb;
>
> @@ -1464,7 +1464,6 @@ struct sk_buff *cxgb4_pktgl_to_skb(const
> }
> out: return skb;
> }
> -EXPORT_SYMBOL(cxgb4_pktgl_to_skb);
>
> /**
> * t4_pktgl_free - free a packet gather list
> --- a/drivers/net/cxgb4/t4_hw.c 2010-10-15 11:35:08.640565879 -0700
> +++ b/drivers/net/cxgb4/t4_hw.c 2010-10-15 11:46:55.167096446 -0700
> @@ -97,53 +97,6 @@ void t4_set_reg_field(struct adapter *ad
> (void) t4_read_reg(adapter, addr); /* flush */
> }
>
> -/**
> - * t4_read_indirect - read indirectly addressed registers
> - * @adap: the adapter
> - * @addr_reg: register holding the indirect address
> - * @data_reg: register holding the value of the indirect register
> - * @vals: where the read register values are stored
> - * @nregs: how many indirect registers to read
> - * @start_idx: index of first indirect register to read
> - *
> - * Reads registers that are accessed indirectly through an address/data
> - * register pair.
> - */
> -static void t4_read_indirect(struct adapter *adap, unsigned int addr_reg,
> - unsigned int data_reg, u32 *vals,
> - unsigned int nregs, unsigned int start_idx)
> -{
> - while (nregs--) {
> - t4_write_reg(adap, addr_reg, start_idx);
> - *vals++ = t4_read_reg(adap, data_reg);
> - start_idx++;
> - }
> -}
> -
> -#if 0
> -/**
> - * t4_write_indirect - write indirectly addressed registers
> - * @adap: the adapter
> - * @addr_reg: register holding the indirect addresses
> - * @data_reg: register holding the value for the indirect registers
> - * @vals: values to write
> - * @nregs: how many indirect registers to write
> - * @start_idx: address of first indirect register to write
> - *
> - * Writes a sequential block of registers that are accessed indirectly
> - * through an address/data register pair.
> - */
> -static void t4_write_indirect(struct adapter *adap, unsigned int addr_reg,
> - unsigned int data_reg, const u32 *vals,
> - unsigned int nregs, unsigned int start_idx)
> -{
> - while (nregs--) {
> - t4_write_reg(adap, addr_reg, start_idx++);
> - t4_write_reg(adap, data_reg, *vals++);
> - }
> -}
> -#endif
> -
> /*
> * Get the reply to a mailbox command and store it in @rpl in big-endian order.
> */
> @@ -1560,44 +1513,6 @@ void t4_intr_disable(struct adapter *ada
> }
>
> /**
> - * t4_intr_clear - clear all interrupts
> - * @adapter: the adapter whose interrupts should be cleared
> - *
> - * Clears all interrupts. The caller must be a PCI function managing
> - * global interrupts.
> - */
> -void t4_intr_clear(struct adapter *adapter)
> -{
> - static const unsigned int cause_reg[] = {
> - SGE_INT_CAUSE1, SGE_INT_CAUSE2, SGE_INT_CAUSE3,
> - PCIE_CORE_UTL_SYSTEM_BUS_AGENT_STATUS,
> - PCIE_CORE_UTL_PCI_EXPRESS_PORT_STATUS,
> - PCIE_NONFAT_ERR, PCIE_INT_CAUSE,
> - MC_INT_CAUSE,
> - MA_INT_WRAP_STATUS, MA_PARITY_ERROR_STATUS, MA_INT_CAUSE,
> - EDC_INT_CAUSE, EDC_REG(EDC_INT_CAUSE, 1),
> - CIM_HOST_INT_CAUSE, CIM_HOST_UPACC_INT_CAUSE,
> - MYPF_REG(CIM_PF_HOST_INT_CAUSE),
> - TP_INT_CAUSE,
> - ULP_RX_INT_CAUSE, ULP_TX_INT_CAUSE,
> - PM_RX_INT_CAUSE, PM_TX_INT_CAUSE,
> - MPS_RX_PERR_INT_CAUSE,
> - CPL_INTR_CAUSE,
> - MYPF_REG(PL_PF_INT_CAUSE),
> - PL_PL_INT_CAUSE,
> - LE_DB_INT_CAUSE,
> - };
> -
> - unsigned int i;
> -
> - for (i = 0; i < ARRAY_SIZE(cause_reg); ++i)
> - t4_write_reg(adapter, cause_reg[i], 0xffffffff);
> -
> - t4_write_reg(adapter, PL_INT_CAUSE, GLBL_INTR_MASK);
> - (void) t4_read_reg(adapter, PL_INT_CAUSE); /* flush */
> -}
> -
> -/**
> * hash_mac_addr - return the hash value of a MAC address
> * @addr: the 48-bit Ethernet MAC address
> *
> @@ -1709,98 +1624,6 @@ int t4_config_glbl_rss(struct adapter *a
> return t4_wr_mbox(adapter, mbox, &c, sizeof(c), NULL);
> }
>
> -/* Read an RSS table row */
> -static int rd_rss_row(struct adapter *adap, int row, u32 *val)
> -{
> - t4_write_reg(adap, TP_RSS_LKP_TABLE, 0xfff00000 | row);
> - return t4_wait_op_done_val(adap, TP_RSS_LKP_TABLE, LKPTBLROWVLD, 1,
> - 5, 0, val);
> -}
> -
> -/**
> - * t4_read_rss - read the contents of the RSS mapping table
> - * @adapter: the adapter
> - * @map: holds the contents of the RSS mapping table
> - *
> - * Reads the contents of the RSS hash->queue mapping table.
> - */
> -int t4_read_rss(struct adapter *adapter, u16 *map)
> -{
> - u32 val;
> - int i, ret;
> -
> - for (i = 0; i < RSS_NENTRIES / 2; ++i) {
> - ret = rd_rss_row(adapter, i, &val);
> - if (ret)
> - return ret;
> - *map++ = LKPTBLQUEUE0_GET(val);
> - *map++ = LKPTBLQUEUE1_GET(val);
> - }
> - return 0;
> -}
> -
> -/**
> - * t4_tp_get_tcp_stats - read TP's TCP MIB counters
> - * @adap: the adapter
> - * @v4: holds the TCP/IP counter values
> - * @v6: holds the TCP/IPv6 counter values
> - *
> - * Returns the values of TP's TCP/IP and TCP/IPv6 MIB counters.
> - * Either @v4 or @v6 may be %NULL to skip the corresponding stats.
> - */
> -void t4_tp_get_tcp_stats(struct adapter *adap, struct tp_tcp_stats *v4,
> - struct tp_tcp_stats *v6)
> -{
> - u32 val[TP_MIB_TCP_RXT_SEG_LO - TP_MIB_TCP_OUT_RST + 1];
> -
> -#define STAT_IDX(x) ((TP_MIB_TCP_##x) - TP_MIB_TCP_OUT_RST)
> -#define STAT(x) val[STAT_IDX(x)]
> -#define STAT64(x) (((u64)STAT(x##_HI) << 32) | STAT(x##_LO))
> -
> - if (v4) {
> - t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, val,
> - ARRAY_SIZE(val), TP_MIB_TCP_OUT_RST);
> - v4->tcpOutRsts = STAT(OUT_RST);
> - v4->tcpInSegs = STAT64(IN_SEG);
> - v4->tcpOutSegs = STAT64(OUT_SEG);
> - v4->tcpRetransSegs = STAT64(RXT_SEG);
> - }
> - if (v6) {
> - t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, val,
> - ARRAY_SIZE(val), TP_MIB_TCP_V6OUT_RST);
> - v6->tcpOutRsts = STAT(OUT_RST);
> - v6->tcpInSegs = STAT64(IN_SEG);
> - v6->tcpOutSegs = STAT64(OUT_SEG);
> - v6->tcpRetransSegs = STAT64(RXT_SEG);
> - }
> -#undef STAT64
> -#undef STAT
> -#undef STAT_IDX
> -}
> -
> -/**
> - * t4_tp_get_err_stats - read TP's error MIB counters
> - * @adap: the adapter
> - * @st: holds the counter values
> - *
> - * Returns the values of TP's error counters.
> - */
> -void t4_tp_get_err_stats(struct adapter *adap, struct tp_err_stats *st)
> -{
> - t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, st->macInErrs,
> - 12, TP_MIB_MAC_IN_ERR_0);
> - t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, st->tnlCongDrops,
> - 8, TP_MIB_TNL_CNG_DROP_0);
> - t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, st->tnlTxDrops,
> - 4, TP_MIB_TNL_DROP_0);
> - t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, st->ofldVlanDrops,
> - 4, TP_MIB_OFD_VLN_DROP_0);
> - t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, st->tcp6InErrs,
> - 4, TP_MIB_TCP_V6IN_ERR_0);
> - t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, &st->ofldNoNeigh,
> - 2, TP_MIB_OFD_ARP_DROP);
> -}
> -
> /**
> * t4_read_mtu_tbl - returns the values in the HW path MTU table
> * @adap: the adapter
> @@ -1916,122 +1739,6 @@ void t4_load_mtus(struct adapter *adap,
> }
>
> /**
> - * t4_set_trace_filter - configure one of the tracing filters
> - * @adap: the adapter
> - * @tp: the desired trace filter parameters
> - * @idx: which filter to configure
> - * @enable: whether to enable or disable the filter
> - *
> - * Configures one of the tracing filters available in HW. If @enable is
> - * %0 @tp is not examined and may be %NULL.
> - */
> -int t4_set_trace_filter(struct adapter *adap, const struct trace_params *tp,
> - int idx, int enable)
> -{
> - int i, ofst = idx * 4;
> - u32 data_reg, mask_reg, cfg;
> - u32 multitrc = TRCMULTIFILTER;
> -
> - if (!enable) {
> - t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A + ofst, 0);
> - goto out;
> - }
> -
> - if (tp->port > 11 || tp->invert > 1 || tp->skip_len > 0x1f ||
> - tp->skip_ofst > 0x1f || tp->min_len > 0x1ff ||
> - tp->snap_len > 9600 || (idx && tp->snap_len > 256))
> - return -EINVAL;
> -
> - if (tp->snap_len > 256) { /* must be tracer 0 */
> - if ((t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A + 4) |
> - t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A + 8) |
> - t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A + 12)) & TFEN)
> - return -EINVAL; /* other tracers are enabled */
> - multitrc = 0;
> - } else if (idx) {
> - i = t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_B);
> - if (TFCAPTUREMAX_GET(i) > 256 &&
> - (t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A) & TFEN))
> - return -EINVAL;
> - }
> -
> - /* stop the tracer we'll be changing */
> - t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A + ofst, 0);
> -
> - /* disable tracing globally if running in the wrong single/multi mode */
> - cfg = t4_read_reg(adap, MPS_TRC_CFG);
> - if ((cfg & TRCEN) && multitrc != (cfg & TRCMULTIFILTER)) {
> - t4_write_reg(adap, MPS_TRC_CFG, cfg ^ TRCEN);
> - t4_read_reg(adap, MPS_TRC_CFG); /* flush */
> - msleep(1);
> - if (!(t4_read_reg(adap, MPS_TRC_CFG) & TRCFIFOEMPTY))
> - return -ETIMEDOUT;
> - }
> - /*
> - * At this point either the tracing is enabled and in the right mode or
> - * disabled.
> - */
> -
> - idx *= (MPS_TRC_FILTER1_MATCH - MPS_TRC_FILTER0_MATCH);
> - data_reg = MPS_TRC_FILTER0_MATCH + idx;
> - mask_reg = MPS_TRC_FILTER0_DONT_CARE + idx;
> -
> - for (i = 0; i < TRACE_LEN / 4; i++, data_reg += 4, mask_reg += 4) {
> - t4_write_reg(adap, data_reg, tp->data[i]);
> - t4_write_reg(adap, mask_reg, ~tp->mask[i]);
> - }
> - t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_B + ofst,
> - TFCAPTUREMAX(tp->snap_len) |
> - TFMINPKTSIZE(tp->min_len));
> - t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A + ofst,
> - TFOFFSET(tp->skip_ofst) | TFLENGTH(tp->skip_len) |
> - TFPORT(tp->port) | TFEN |
> - (tp->invert ? TFINVERTMATCH : 0));
> -
> - cfg &= ~TRCMULTIFILTER;
> - t4_write_reg(adap, MPS_TRC_CFG, cfg | TRCEN | multitrc);
> -out: t4_read_reg(adap, MPS_TRC_CFG); /* flush */
> - return 0;
> -}
> -
> -/**
> - * t4_get_trace_filter - query one of the tracing filters
> - * @adap: the adapter
> - * @tp: the current trace filter parameters
> - * @idx: which trace filter to query
> - * @enabled: non-zero if the filter is enabled
> - *
> - * Returns the current settings of one of the HW tracing filters.
> - */
> -void t4_get_trace_filter(struct adapter *adap, struct trace_params *tp, int idx,
> - int *enabled)
> -{
> - u32 ctla, ctlb;
> - int i, ofst = idx * 4;
> - u32 data_reg, mask_reg;
> -
> - ctla = t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A + ofst);
> - ctlb = t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_B + ofst);
> -
> - *enabled = !!(ctla & TFEN);
> - tp->snap_len = TFCAPTUREMAX_GET(ctlb);
> - tp->min_len = TFMINPKTSIZE_GET(ctlb);
> - tp->skip_ofst = TFOFFSET_GET(ctla);
> - tp->skip_len = TFLENGTH_GET(ctla);
> - tp->invert = !!(ctla & TFINVERTMATCH);
> - tp->port = TFPORT_GET(ctla);
> -
> - ofst = (MPS_TRC_FILTER1_MATCH - MPS_TRC_FILTER0_MATCH) * idx;
> - data_reg = MPS_TRC_FILTER0_MATCH + ofst;
> - mask_reg = MPS_TRC_FILTER0_DONT_CARE + ofst;
> -
> - for (i = 0; i < TRACE_LEN / 4; i++, data_reg += 4, mask_reg += 4) {
> - tp->mask[i] = ~t4_read_reg(adap, mask_reg);
> - tp->data[i] = t4_read_reg(adap, data_reg) & tp->mask[i];
> - }
> -}
> -
> -/**
> * get_mps_bg_map - return the buffer groups associated with a port
> * @adap: the adapter
> * @idx: the port index
> @@ -2133,52 +1840,6 @@ void t4_get_port_stats(struct adapter *a
> }
>
> /**
> - * t4_get_lb_stats - collect loopback port statistics
> - * @adap: the adapter
> - * @idx: the loopback port index
> - * @p: the stats structure to fill
> - *
> - * Return HW statistics for the given loopback port.
> - */
> -void t4_get_lb_stats(struct adapter *adap, int idx, struct lb_port_stats *p)
> -{
> - u32 bgmap = get_mps_bg_map(adap, idx);
> -
> -#define GET_STAT(name) \
> - t4_read_reg64(adap, PORT_REG(idx, MPS_PORT_STAT_LB_PORT_##name##_L))
> -#define GET_STAT_COM(name) t4_read_reg64(adap, MPS_STAT_##name##_L)
> -
> - p->octets = GET_STAT(BYTES);
> - p->frames = GET_STAT(FRAMES);
> - p->bcast_frames = GET_STAT(BCAST);
> - p->mcast_frames = GET_STAT(MCAST);
> - p->ucast_frames = GET_STAT(UCAST);
> - p->error_frames = GET_STAT(ERROR);
> -
> - p->frames_64 = GET_STAT(64B);
> - p->frames_65_127 = GET_STAT(65B_127B);
> - p->frames_128_255 = GET_STAT(128B_255B);
> - p->frames_256_511 = GET_STAT(256B_511B);
> - p->frames_512_1023 = GET_STAT(512B_1023B);
> - p->frames_1024_1518 = GET_STAT(1024B_1518B);
> - p->frames_1519_max = GET_STAT(1519B_MAX);
> - p->drop = t4_read_reg(adap, PORT_REG(idx,
> - MPS_PORT_STAT_LB_PORT_DROP_FRAMES));
> -
> - p->ovflow0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_LB_DROP_FRAME) : 0;
> - p->ovflow1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_LB_DROP_FRAME) : 0;
> - p->ovflow2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_LB_DROP_FRAME) : 0;
> - p->ovflow3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_LB_DROP_FRAME) : 0;
> - p->trunc0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_LB_TRUNC_FRAME) : 0;
> - p->trunc1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_LB_TRUNC_FRAME) : 0;
> - p->trunc2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_LB_TRUNC_FRAME) : 0;
> - p->trunc3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_LB_TRUNC_FRAME) : 0;
> -
> -#undef GET_STAT
> -#undef GET_STAT_COM
> -}
> -
> -/**
> * t4_wol_magic_enable - enable/disable magic packet WoL
> * @adap: the adapter
> * @port: the physical port index
> @@ -2584,30 +2245,6 @@ int t4_alloc_vi(struct adapter *adap, un
> }
>
> /**
> - * t4_free_vi - free a virtual interface
> - * @adap: the adapter
> - * @mbox: mailbox to use for the FW command
> - * @pf: the PF owning the VI
> - * @vf: the VF owning the VI
> - * @viid: virtual interface identifiler
> - *
> - * Free a previously allocated virtual interface.
> - */
> -int t4_free_vi(struct adapter *adap, unsigned int mbox, unsigned int pf,
> - unsigned int vf, unsigned int viid)
> -{
> - struct fw_vi_cmd c;
> -
> - memset(&c, 0, sizeof(c));
> - c.op_to_vfn = htonl(FW_CMD_OP(FW_VI_CMD) | FW_CMD_REQUEST |
> - FW_CMD_EXEC | FW_VI_CMD_PFN(pf) |
> - FW_VI_CMD_VFN(vf));
> - c.alloc_to_len16 = htonl(FW_VI_CMD_FREE | FW_LEN16(c));
> - c.type_viid = htons(FW_VI_CMD_VIID(viid));
> - return t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
> -}
> -
> -/**
> * t4_set_rxmode - set Rx properties of a virtual interface
> * @adap: the adapter
> * @mbox: mailbox to use for the FW command
> @@ -2832,37 +2469,6 @@ int t4_identify_port(struct adapter *ada
> return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
> }
>
> -/**
> - * t4_iq_start_stop - enable/disable an ingress queue and its FLs
> - * @adap: the adapter
> - * @mbox: mailbox to use for the FW command
> - * @start: %true to enable the queues, %false to disable them
> - * @pf: the PF owning the queues
> - * @vf: the VF owning the queues
> - * @iqid: ingress queue id
> - * @fl0id: FL0 queue id or 0xffff if no attached FL0
> - * @fl1id: FL1 queue id or 0xffff if no attached FL1
> - *
> - * Starts or stops an ingress queue and its associated FLs, if any.
> - */
> -int t4_iq_start_stop(struct adapter *adap, unsigned int mbox, bool start,
> - unsigned int pf, unsigned int vf, unsigned int iqid,
> - unsigned int fl0id, unsigned int fl1id)
> -{
> - struct fw_iq_cmd c;
> -
> - memset(&c, 0, sizeof(c));
> - c.op_to_vfn = htonl(FW_CMD_OP(FW_IQ_CMD) | FW_CMD_REQUEST |
> - FW_CMD_EXEC | FW_IQ_CMD_PFN(pf) |
> - FW_IQ_CMD_VFN(vf));
> - c.alloc_to_len16 = htonl(FW_IQ_CMD_IQSTART(start) |
> - FW_IQ_CMD_IQSTOP(!start) | FW_LEN16(c));
> - c.iqid = htons(iqid);
> - c.fl0id = htons(fl0id);
> - c.fl1id = htons(fl1id);
> - return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
> -}
> -
> /**
> * t4_iq_free - free an ingress queue and its FLs
> * @adap: the adapter
>
>
^ permalink raw reply
* Re: [PATCH 2/3] cxgb4: function namespace cleanup
From: Joe Perches @ 2010-10-15 23:29 UTC (permalink / raw)
To: Stephen Hemminger
Cc: Divy Le Ray, David S. Miller, Casey Leedom, Dimitris Michailidis,
netdev
In-Reply-To: <20101015224523.633775810@vyatta.com>
On Fri, 2010-10-15 at 15:43 -0700, Stephen Hemminger wrote:
> plain text document attachment (cxgb4-local.patch)
> Make functions only used in one file local.
> Remove lots of dead code. Most surprising is the function
> cxgb4_iscsi_init which is defined but never called!
> Compile tested only
drivers/scsi/cxgbi/cxgb4i/cxgb4i.c:1423: cxgb4_iscsi_init(lldi->ports[0], tagmask, pgsz_factor);
^ permalink raw reply
* [PATCH 2/3] cxgb4: function namespace cleanup
From: Stephen Hemminger @ 2010-10-15 22:43 UTC (permalink / raw)
To: Divy Le Ray, David S. Miller, Casey Leedom, Dimitris Michailidis; +Cc: netdev
In-Reply-To: <20101015224309.179898823@vyatta.com>
[-- Attachment #1: cxgb4-local.patch --]
[-- Type: text/plain, Size: 26898 bytes --]
Make functions only used in one file local.
Remove lots of dead code. Most surprising is the function
cxgb4_iscsi_init which is defined but never called!
Compile tested only
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
---
drivers/net/cxgb4/cxgb4.h | 17 -
drivers/net/cxgb4/cxgb4_main.c | 91 ---------
drivers/net/cxgb4/cxgb4_uld.h | 12 -
drivers/net/cxgb4/l2t.c | 34 ---
drivers/net/cxgb4/l2t.h | 3
drivers/net/cxgb4/sge.c | 5
drivers/net/cxgb4/t4_hw.c | 394 -----------------------------------------
7 files changed, 5 insertions(+), 551 deletions(-)
--- a/drivers/net/cxgb4/cxgb4_main.c 2010-10-15 11:31:38.980766681 -0700
+++ b/drivers/net/cxgb4/cxgb4_main.c 2010-10-15 11:40:13.976943486 -0700
@@ -880,7 +880,7 @@ void *t4_alloc_mem(size_t size)
/*
* Free memory allocated through alloc_mem().
*/
-void t4_free_mem(void *addr)
+static void t4_free_mem(void *addr)
{
if (is_vmalloc_addr(addr))
vfree(addr);
@@ -2206,8 +2206,8 @@ static void mk_tid_release(struct sk_buf
* Queue a TID release request and if necessary schedule a work queue to
* process it.
*/
-void cxgb4_queue_tid_release(struct tid_info *t, unsigned int chan,
- unsigned int tid)
+static void cxgb4_queue_tid_release(struct tid_info *t, unsigned int chan,
+ unsigned int tid)
{
void **p = &t->tid_tab[tid];
struct adapter *adap = container_of(t, struct adapter, tids);
@@ -2222,7 +2222,6 @@ void cxgb4_queue_tid_release(struct tid_
}
spin_unlock_bh(&adap->tid_release_lock);
}
-EXPORT_SYMBOL(cxgb4_queue_tid_release);
/*
* Process the list of pending TID release requests.
@@ -2355,48 +2354,6 @@ int cxgb4_create_server(const struct net
EXPORT_SYMBOL(cxgb4_create_server);
/**
- * cxgb4_create_server6 - create an IPv6 server
- * @dev: the device
- * @stid: the server TID
- * @sip: local IPv6 address to bind server to
- * @sport: the server's TCP port
- * @queue: queue to direct messages from this server to
- *
- * Create an IPv6 server for the given port and address.
- * Returns <0 on error and one of the %NET_XMIT_* values on success.
- */
-int cxgb4_create_server6(const struct net_device *dev, unsigned int stid,
- const struct in6_addr *sip, __be16 sport,
- unsigned int queue)
-{
- unsigned int chan;
- struct sk_buff *skb;
- struct adapter *adap;
- struct cpl_pass_open_req6 *req;
-
- skb = alloc_skb(sizeof(*req), GFP_KERNEL);
- if (!skb)
- return -ENOMEM;
-
- adap = netdev2adap(dev);
- req = (struct cpl_pass_open_req6 *)__skb_put(skb, sizeof(*req));
- INIT_TP_WR(req, 0);
- OPCODE_TID(req) = htonl(MK_OPCODE_TID(CPL_PASS_OPEN_REQ6, stid));
- req->local_port = sport;
- req->peer_port = htons(0);
- req->local_ip_hi = *(__be64 *)(sip->s6_addr);
- req->local_ip_lo = *(__be64 *)(sip->s6_addr + 8);
- req->peer_ip_hi = cpu_to_be64(0);
- req->peer_ip_lo = cpu_to_be64(0);
- chan = rxq_to_chan(&adap->sge, queue);
- req->opt0 = cpu_to_be64(TX_CHAN(chan));
- req->opt1 = cpu_to_be64(CONN_POLICY_ASK |
- SYN_RSS_ENABLE | SYN_RSS_QUEUE(queue));
- return t4_mgmt_tx(adap, skb);
-}
-EXPORT_SYMBOL(cxgb4_create_server6);
-
-/**
* cxgb4_best_mtu - find the entry in the MTU table closest to an MTU
* @mtus: the HW MTU table
* @mtu: the target MTU
@@ -2455,48 +2412,6 @@ unsigned int cxgb4_port_idx(const struct
}
EXPORT_SYMBOL(cxgb4_port_idx);
-/**
- * cxgb4_netdev_by_hwid - return the net device of a HW port
- * @pdev: identifies the adapter
- * @id: the HW port id
- *
- * Return the net device associated with the interface with the given HW
- * id.
- */
-struct net_device *cxgb4_netdev_by_hwid(struct pci_dev *pdev, unsigned int id)
-{
- const struct adapter *adap = pci_get_drvdata(pdev);
-
- if (!adap || id >= NCHAN)
- return NULL;
- id = adap->chan_map[id];
- return id < MAX_NPORTS ? adap->port[id] : NULL;
-}
-EXPORT_SYMBOL(cxgb4_netdev_by_hwid);
-
-void cxgb4_get_tcp_stats(struct pci_dev *pdev, struct tp_tcp_stats *v4,
- struct tp_tcp_stats *v6)
-{
- struct adapter *adap = pci_get_drvdata(pdev);
-
- spin_lock(&adap->stats_lock);
- t4_tp_get_tcp_stats(adap, v4, v6);
- spin_unlock(&adap->stats_lock);
-}
-EXPORT_SYMBOL(cxgb4_get_tcp_stats);
-
-void cxgb4_iscsi_init(struct net_device *dev, unsigned int tag_mask,
- const unsigned int *pgsz_order)
-{
- struct adapter *adap = netdev2adap(dev);
-
- t4_write_reg(adap, ULP_RX_ISCSI_TAGMASK, tag_mask);
- t4_write_reg(adap, ULP_RX_ISCSI_PSZ, HPZ0(pgsz_order[0]) |
- HPZ1(pgsz_order[1]) | HPZ2(pgsz_order[2]) |
- HPZ3(pgsz_order[3]));
-}
-EXPORT_SYMBOL(cxgb4_iscsi_init);
-
static struct pci_driver cxgb4_driver;
static void check_neigh_update(struct neighbour *neigh)
--- a/drivers/net/cxgb4/cxgb4_uld.h 2010-10-15 11:31:38.964766089 -0700
+++ b/drivers/net/cxgb4/cxgb4_uld.h 2010-10-15 11:39:06.777878706 -0700
@@ -139,16 +139,11 @@ int cxgb4_alloc_stid(struct tid_info *t,
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)
{
@@ -233,13 +228,6 @@ int cxgb4_ofld_send(struct net_device *d
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 */
--- a/drivers/net/cxgb4/cxgb4.h 2010-10-15 11:40:02.748431897 -0700
+++ b/drivers/net/cxgb4/cxgb4.h 2010-10-15 11:46:18.685455254 -0700
@@ -592,7 +592,6 @@ void t4_os_portmod_changed(const struct
void t4_os_link_changed(struct adapter *adap, int port_id, int link_stat);
void *t4_alloc_mem(size_t size);
-void t4_free_mem(void *addr);
void t4_free_sge_resources(struct adapter *adap);
irq_handler_t t4_intr_handler(struct adapter *adap);
@@ -651,7 +650,6 @@ static inline int t4_wr_mbox_ns(struct a
void t4_intr_enable(struct adapter *adapter);
void t4_intr_disable(struct adapter *adapter);
-void t4_intr_clear(struct adapter *adapter);
int t4_slow_intr_handler(struct adapter *adapter);
int t4_wait_dev_ready(struct adapter *adap);
@@ -664,26 +662,16 @@ int t4_check_fw_version(struct adapter *
int t4_prep_adapter(struct adapter *adapter);
int t4_port_init(struct adapter *adap, int mbox, int pf, int vf);
void t4_fatal_err(struct adapter *adapter);
-int t4_set_trace_filter(struct adapter *adapter, const struct trace_params *tp,
- int filter_index, int enable);
-void t4_get_trace_filter(struct adapter *adapter, struct trace_params *tp,
- int filter_index, int *enabled);
int t4_config_rss_range(struct adapter *adapter, int mbox, unsigned int viid,
int start, int n, const u16 *rspq, unsigned int nrspq);
int t4_config_glbl_rss(struct adapter *adapter, int mbox, unsigned int mode,
unsigned int flags);
-int t4_read_rss(struct adapter *adapter, u16 *entries);
int t4_mc_read(struct adapter *adap, u32 addr, __be32 *data, u64 *parity);
int t4_edc_read(struct adapter *adap, int idx, u32 addr, __be32 *data,
u64 *parity);
void t4_get_port_stats(struct adapter *adap, int idx, struct port_stats *p);
-void t4_get_lb_stats(struct adapter *adap, int idx, struct lb_port_stats *p);
-
void t4_read_mtu_tbl(struct adapter *adap, u16 *mtus, u8 *mtu_log);
-void t4_tp_get_err_stats(struct adapter *adap, struct tp_err_stats *st);
-void t4_tp_get_tcp_stats(struct adapter *adap, struct tp_tcp_stats *v4,
- struct tp_tcp_stats *v6);
void t4_load_mtus(struct adapter *adap, const unsigned short *mtus,
const unsigned short *alpha, const unsigned short *beta);
@@ -711,8 +699,6 @@ int t4_cfg_pfvf(struct adapter *adap, un
int t4_alloc_vi(struct adapter *adap, unsigned int mbox, unsigned int port,
unsigned int pf, unsigned int vf, unsigned int nmac, u8 *mac,
unsigned int *rss_size);
-int t4_free_vi(struct adapter *adap, unsigned int mbox, unsigned int pf,
- unsigned int vf, unsigned int viid);
int t4_set_rxmode(struct adapter *adap, unsigned int mbox, unsigned int viid,
int mtu, int promisc, int all_multi, int bcast, int vlanex,
bool sleep_ok);
@@ -731,9 +717,6 @@ int t4_mdio_rd(struct adapter *adap, uns
unsigned int mmd, unsigned int reg, u16 *valp);
int t4_mdio_wr(struct adapter *adap, unsigned int mbox, unsigned int phy_addr,
unsigned int mmd, unsigned int reg, u16 val);
-int t4_iq_start_stop(struct adapter *adap, unsigned int mbox, bool start,
- unsigned int pf, unsigned int vf, unsigned int iqid,
- unsigned int fl0id, unsigned int fl1id);
int t4_iq_free(struct adapter *adap, unsigned int mbox, unsigned int pf,
unsigned int vf, unsigned int iqtype, unsigned int iqid,
unsigned int fl0id, unsigned int fl1id);
--- a/drivers/net/cxgb4/l2t.c 2010-10-15 11:33:43.549387836 -0700
+++ b/drivers/net/cxgb4/l2t.c 2010-10-15 11:33:55.949849920 -0700
@@ -481,40 +481,6 @@ void t4_l2t_update(struct adapter *adap,
handle_failed_resolution(adap, arpq);
}
-/*
- * Allocate an L2T entry for use by a switching rule. Such entries need to be
- * explicitly freed and while busy they are not on any hash chain, so normal
- * address resolution updates do not see them.
- */
-struct l2t_entry *t4_l2t_alloc_switching(struct l2t_data *d)
-{
- struct l2t_entry *e;
-
- write_lock_bh(&d->lock);
- e = alloc_l2e(d);
- if (e) {
- spin_lock(&e->lock); /* avoid race with t4_l2t_free */
- e->state = L2T_STATE_SWITCHING;
- atomic_set(&e->refcnt, 1);
- spin_unlock(&e->lock);
- }
- write_unlock_bh(&d->lock);
- return e;
-}
-
-/*
- * Sets/updates the contents of a switching L2T entry that has been allocated
- * with an earlier call to @t4_l2t_alloc_switching.
- */
-int t4_l2t_set_switching(struct adapter *adap, struct l2t_entry *e, u16 vlan,
- u8 port, u8 *eth_addr)
-{
- e->vlan = vlan;
- e->lport = port;
- memcpy(e->dmac, eth_addr, ETH_ALEN);
- return write_l2e(adap, e, 0);
-}
-
struct l2t_data *t4_init_l2t(void)
{
int i;
--- a/drivers/net/cxgb4/l2t.h 2010-10-15 11:33:00.175774482 -0700
+++ b/drivers/net/cxgb4/l2t.h 2010-10-15 11:33:13.728278102 -0700
@@ -100,9 +100,6 @@ struct l2t_entry *cxgb4_l2t_get(struct l
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);
--- a/drivers/net/cxgb4/sge.c 2010-10-15 11:34:06.486242828 -0700
+++ b/drivers/net/cxgb4/sge.c 2010-10-15 11:34:41.967567863 -0700
@@ -1434,8 +1434,8 @@ static inline void copy_frags(struct skb
* Builds an sk_buff from the given packet gather list. Returns the
* sk_buff or %NULL if sk_buff allocation failed.
*/
-struct sk_buff *cxgb4_pktgl_to_skb(const struct pkt_gl *gl,
- unsigned int skb_len, unsigned int pull_len)
+static struct sk_buff *cxgb4_pktgl_to_skb(const struct pkt_gl *gl,
+ unsigned int skb_len, unsigned int pull_len)
{
struct sk_buff *skb;
@@ -1464,7 +1464,6 @@ struct sk_buff *cxgb4_pktgl_to_skb(const
}
out: return skb;
}
-EXPORT_SYMBOL(cxgb4_pktgl_to_skb);
/**
* t4_pktgl_free - free a packet gather list
--- a/drivers/net/cxgb4/t4_hw.c 2010-10-15 11:35:08.640565879 -0700
+++ b/drivers/net/cxgb4/t4_hw.c 2010-10-15 11:46:55.167096446 -0700
@@ -97,53 +97,6 @@ void t4_set_reg_field(struct adapter *ad
(void) t4_read_reg(adapter, addr); /* flush */
}
-/**
- * t4_read_indirect - read indirectly addressed registers
- * @adap: the adapter
- * @addr_reg: register holding the indirect address
- * @data_reg: register holding the value of the indirect register
- * @vals: where the read register values are stored
- * @nregs: how many indirect registers to read
- * @start_idx: index of first indirect register to read
- *
- * Reads registers that are accessed indirectly through an address/data
- * register pair.
- */
-static void t4_read_indirect(struct adapter *adap, unsigned int addr_reg,
- unsigned int data_reg, u32 *vals,
- unsigned int nregs, unsigned int start_idx)
-{
- while (nregs--) {
- t4_write_reg(adap, addr_reg, start_idx);
- *vals++ = t4_read_reg(adap, data_reg);
- start_idx++;
- }
-}
-
-#if 0
-/**
- * t4_write_indirect - write indirectly addressed registers
- * @adap: the adapter
- * @addr_reg: register holding the indirect addresses
- * @data_reg: register holding the value for the indirect registers
- * @vals: values to write
- * @nregs: how many indirect registers to write
- * @start_idx: address of first indirect register to write
- *
- * Writes a sequential block of registers that are accessed indirectly
- * through an address/data register pair.
- */
-static void t4_write_indirect(struct adapter *adap, unsigned int addr_reg,
- unsigned int data_reg, const u32 *vals,
- unsigned int nregs, unsigned int start_idx)
-{
- while (nregs--) {
- t4_write_reg(adap, addr_reg, start_idx++);
- t4_write_reg(adap, data_reg, *vals++);
- }
-}
-#endif
-
/*
* Get the reply to a mailbox command and store it in @rpl in big-endian order.
*/
@@ -1560,44 +1513,6 @@ void t4_intr_disable(struct adapter *ada
}
/**
- * t4_intr_clear - clear all interrupts
- * @adapter: the adapter whose interrupts should be cleared
- *
- * Clears all interrupts. The caller must be a PCI function managing
- * global interrupts.
- */
-void t4_intr_clear(struct adapter *adapter)
-{
- static const unsigned int cause_reg[] = {
- SGE_INT_CAUSE1, SGE_INT_CAUSE2, SGE_INT_CAUSE3,
- PCIE_CORE_UTL_SYSTEM_BUS_AGENT_STATUS,
- PCIE_CORE_UTL_PCI_EXPRESS_PORT_STATUS,
- PCIE_NONFAT_ERR, PCIE_INT_CAUSE,
- MC_INT_CAUSE,
- MA_INT_WRAP_STATUS, MA_PARITY_ERROR_STATUS, MA_INT_CAUSE,
- EDC_INT_CAUSE, EDC_REG(EDC_INT_CAUSE, 1),
- CIM_HOST_INT_CAUSE, CIM_HOST_UPACC_INT_CAUSE,
- MYPF_REG(CIM_PF_HOST_INT_CAUSE),
- TP_INT_CAUSE,
- ULP_RX_INT_CAUSE, ULP_TX_INT_CAUSE,
- PM_RX_INT_CAUSE, PM_TX_INT_CAUSE,
- MPS_RX_PERR_INT_CAUSE,
- CPL_INTR_CAUSE,
- MYPF_REG(PL_PF_INT_CAUSE),
- PL_PL_INT_CAUSE,
- LE_DB_INT_CAUSE,
- };
-
- unsigned int i;
-
- for (i = 0; i < ARRAY_SIZE(cause_reg); ++i)
- t4_write_reg(adapter, cause_reg[i], 0xffffffff);
-
- t4_write_reg(adapter, PL_INT_CAUSE, GLBL_INTR_MASK);
- (void) t4_read_reg(adapter, PL_INT_CAUSE); /* flush */
-}
-
-/**
* hash_mac_addr - return the hash value of a MAC address
* @addr: the 48-bit Ethernet MAC address
*
@@ -1709,98 +1624,6 @@ int t4_config_glbl_rss(struct adapter *a
return t4_wr_mbox(adapter, mbox, &c, sizeof(c), NULL);
}
-/* Read an RSS table row */
-static int rd_rss_row(struct adapter *adap, int row, u32 *val)
-{
- t4_write_reg(adap, TP_RSS_LKP_TABLE, 0xfff00000 | row);
- return t4_wait_op_done_val(adap, TP_RSS_LKP_TABLE, LKPTBLROWVLD, 1,
- 5, 0, val);
-}
-
-/**
- * t4_read_rss - read the contents of the RSS mapping table
- * @adapter: the adapter
- * @map: holds the contents of the RSS mapping table
- *
- * Reads the contents of the RSS hash->queue mapping table.
- */
-int t4_read_rss(struct adapter *adapter, u16 *map)
-{
- u32 val;
- int i, ret;
-
- for (i = 0; i < RSS_NENTRIES / 2; ++i) {
- ret = rd_rss_row(adapter, i, &val);
- if (ret)
- return ret;
- *map++ = LKPTBLQUEUE0_GET(val);
- *map++ = LKPTBLQUEUE1_GET(val);
- }
- return 0;
-}
-
-/**
- * t4_tp_get_tcp_stats - read TP's TCP MIB counters
- * @adap: the adapter
- * @v4: holds the TCP/IP counter values
- * @v6: holds the TCP/IPv6 counter values
- *
- * Returns the values of TP's TCP/IP and TCP/IPv6 MIB counters.
- * Either @v4 or @v6 may be %NULL to skip the corresponding stats.
- */
-void t4_tp_get_tcp_stats(struct adapter *adap, struct tp_tcp_stats *v4,
- struct tp_tcp_stats *v6)
-{
- u32 val[TP_MIB_TCP_RXT_SEG_LO - TP_MIB_TCP_OUT_RST + 1];
-
-#define STAT_IDX(x) ((TP_MIB_TCP_##x) - TP_MIB_TCP_OUT_RST)
-#define STAT(x) val[STAT_IDX(x)]
-#define STAT64(x) (((u64)STAT(x##_HI) << 32) | STAT(x##_LO))
-
- if (v4) {
- t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, val,
- ARRAY_SIZE(val), TP_MIB_TCP_OUT_RST);
- v4->tcpOutRsts = STAT(OUT_RST);
- v4->tcpInSegs = STAT64(IN_SEG);
- v4->tcpOutSegs = STAT64(OUT_SEG);
- v4->tcpRetransSegs = STAT64(RXT_SEG);
- }
- if (v6) {
- t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, val,
- ARRAY_SIZE(val), TP_MIB_TCP_V6OUT_RST);
- v6->tcpOutRsts = STAT(OUT_RST);
- v6->tcpInSegs = STAT64(IN_SEG);
- v6->tcpOutSegs = STAT64(OUT_SEG);
- v6->tcpRetransSegs = STAT64(RXT_SEG);
- }
-#undef STAT64
-#undef STAT
-#undef STAT_IDX
-}
-
-/**
- * t4_tp_get_err_stats - read TP's error MIB counters
- * @adap: the adapter
- * @st: holds the counter values
- *
- * Returns the values of TP's error counters.
- */
-void t4_tp_get_err_stats(struct adapter *adap, struct tp_err_stats *st)
-{
- t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, st->macInErrs,
- 12, TP_MIB_MAC_IN_ERR_0);
- t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, st->tnlCongDrops,
- 8, TP_MIB_TNL_CNG_DROP_0);
- t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, st->tnlTxDrops,
- 4, TP_MIB_TNL_DROP_0);
- t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, st->ofldVlanDrops,
- 4, TP_MIB_OFD_VLN_DROP_0);
- t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, st->tcp6InErrs,
- 4, TP_MIB_TCP_V6IN_ERR_0);
- t4_read_indirect(adap, TP_MIB_INDEX, TP_MIB_DATA, &st->ofldNoNeigh,
- 2, TP_MIB_OFD_ARP_DROP);
-}
-
/**
* t4_read_mtu_tbl - returns the values in the HW path MTU table
* @adap: the adapter
@@ -1916,122 +1739,6 @@ void t4_load_mtus(struct adapter *adap,
}
/**
- * t4_set_trace_filter - configure one of the tracing filters
- * @adap: the adapter
- * @tp: the desired trace filter parameters
- * @idx: which filter to configure
- * @enable: whether to enable or disable the filter
- *
- * Configures one of the tracing filters available in HW. If @enable is
- * %0 @tp is not examined and may be %NULL.
- */
-int t4_set_trace_filter(struct adapter *adap, const struct trace_params *tp,
- int idx, int enable)
-{
- int i, ofst = idx * 4;
- u32 data_reg, mask_reg, cfg;
- u32 multitrc = TRCMULTIFILTER;
-
- if (!enable) {
- t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A + ofst, 0);
- goto out;
- }
-
- if (tp->port > 11 || tp->invert > 1 || tp->skip_len > 0x1f ||
- tp->skip_ofst > 0x1f || tp->min_len > 0x1ff ||
- tp->snap_len > 9600 || (idx && tp->snap_len > 256))
- return -EINVAL;
-
- if (tp->snap_len > 256) { /* must be tracer 0 */
- if ((t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A + 4) |
- t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A + 8) |
- t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A + 12)) & TFEN)
- return -EINVAL; /* other tracers are enabled */
- multitrc = 0;
- } else if (idx) {
- i = t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_B);
- if (TFCAPTUREMAX_GET(i) > 256 &&
- (t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A) & TFEN))
- return -EINVAL;
- }
-
- /* stop the tracer we'll be changing */
- t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A + ofst, 0);
-
- /* disable tracing globally if running in the wrong single/multi mode */
- cfg = t4_read_reg(adap, MPS_TRC_CFG);
- if ((cfg & TRCEN) && multitrc != (cfg & TRCMULTIFILTER)) {
- t4_write_reg(adap, MPS_TRC_CFG, cfg ^ TRCEN);
- t4_read_reg(adap, MPS_TRC_CFG); /* flush */
- msleep(1);
- if (!(t4_read_reg(adap, MPS_TRC_CFG) & TRCFIFOEMPTY))
- return -ETIMEDOUT;
- }
- /*
- * At this point either the tracing is enabled and in the right mode or
- * disabled.
- */
-
- idx *= (MPS_TRC_FILTER1_MATCH - MPS_TRC_FILTER0_MATCH);
- data_reg = MPS_TRC_FILTER0_MATCH + idx;
- mask_reg = MPS_TRC_FILTER0_DONT_CARE + idx;
-
- for (i = 0; i < TRACE_LEN / 4; i++, data_reg += 4, mask_reg += 4) {
- t4_write_reg(adap, data_reg, tp->data[i]);
- t4_write_reg(adap, mask_reg, ~tp->mask[i]);
- }
- t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_B + ofst,
- TFCAPTUREMAX(tp->snap_len) |
- TFMINPKTSIZE(tp->min_len));
- t4_write_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A + ofst,
- TFOFFSET(tp->skip_ofst) | TFLENGTH(tp->skip_len) |
- TFPORT(tp->port) | TFEN |
- (tp->invert ? TFINVERTMATCH : 0));
-
- cfg &= ~TRCMULTIFILTER;
- t4_write_reg(adap, MPS_TRC_CFG, cfg | TRCEN | multitrc);
-out: t4_read_reg(adap, MPS_TRC_CFG); /* flush */
- return 0;
-}
-
-/**
- * t4_get_trace_filter - query one of the tracing filters
- * @adap: the adapter
- * @tp: the current trace filter parameters
- * @idx: which trace filter to query
- * @enabled: non-zero if the filter is enabled
- *
- * Returns the current settings of one of the HW tracing filters.
- */
-void t4_get_trace_filter(struct adapter *adap, struct trace_params *tp, int idx,
- int *enabled)
-{
- u32 ctla, ctlb;
- int i, ofst = idx * 4;
- u32 data_reg, mask_reg;
-
- ctla = t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_A + ofst);
- ctlb = t4_read_reg(adap, MPS_TRC_FILTER_MATCH_CTL_B + ofst);
-
- *enabled = !!(ctla & TFEN);
- tp->snap_len = TFCAPTUREMAX_GET(ctlb);
- tp->min_len = TFMINPKTSIZE_GET(ctlb);
- tp->skip_ofst = TFOFFSET_GET(ctla);
- tp->skip_len = TFLENGTH_GET(ctla);
- tp->invert = !!(ctla & TFINVERTMATCH);
- tp->port = TFPORT_GET(ctla);
-
- ofst = (MPS_TRC_FILTER1_MATCH - MPS_TRC_FILTER0_MATCH) * idx;
- data_reg = MPS_TRC_FILTER0_MATCH + ofst;
- mask_reg = MPS_TRC_FILTER0_DONT_CARE + ofst;
-
- for (i = 0; i < TRACE_LEN / 4; i++, data_reg += 4, mask_reg += 4) {
- tp->mask[i] = ~t4_read_reg(adap, mask_reg);
- tp->data[i] = t4_read_reg(adap, data_reg) & tp->mask[i];
- }
-}
-
-/**
* get_mps_bg_map - return the buffer groups associated with a port
* @adap: the adapter
* @idx: the port index
@@ -2133,52 +1840,6 @@ void t4_get_port_stats(struct adapter *a
}
/**
- * t4_get_lb_stats - collect loopback port statistics
- * @adap: the adapter
- * @idx: the loopback port index
- * @p: the stats structure to fill
- *
- * Return HW statistics for the given loopback port.
- */
-void t4_get_lb_stats(struct adapter *adap, int idx, struct lb_port_stats *p)
-{
- u32 bgmap = get_mps_bg_map(adap, idx);
-
-#define GET_STAT(name) \
- t4_read_reg64(adap, PORT_REG(idx, MPS_PORT_STAT_LB_PORT_##name##_L))
-#define GET_STAT_COM(name) t4_read_reg64(adap, MPS_STAT_##name##_L)
-
- p->octets = GET_STAT(BYTES);
- p->frames = GET_STAT(FRAMES);
- p->bcast_frames = GET_STAT(BCAST);
- p->mcast_frames = GET_STAT(MCAST);
- p->ucast_frames = GET_STAT(UCAST);
- p->error_frames = GET_STAT(ERROR);
-
- p->frames_64 = GET_STAT(64B);
- p->frames_65_127 = GET_STAT(65B_127B);
- p->frames_128_255 = GET_STAT(128B_255B);
- p->frames_256_511 = GET_STAT(256B_511B);
- p->frames_512_1023 = GET_STAT(512B_1023B);
- p->frames_1024_1518 = GET_STAT(1024B_1518B);
- p->frames_1519_max = GET_STAT(1519B_MAX);
- p->drop = t4_read_reg(adap, PORT_REG(idx,
- MPS_PORT_STAT_LB_PORT_DROP_FRAMES));
-
- p->ovflow0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_LB_DROP_FRAME) : 0;
- p->ovflow1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_LB_DROP_FRAME) : 0;
- p->ovflow2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_LB_DROP_FRAME) : 0;
- p->ovflow3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_LB_DROP_FRAME) : 0;
- p->trunc0 = (bgmap & 1) ? GET_STAT_COM(RX_BG_0_LB_TRUNC_FRAME) : 0;
- p->trunc1 = (bgmap & 2) ? GET_STAT_COM(RX_BG_1_LB_TRUNC_FRAME) : 0;
- p->trunc2 = (bgmap & 4) ? GET_STAT_COM(RX_BG_2_LB_TRUNC_FRAME) : 0;
- p->trunc3 = (bgmap & 8) ? GET_STAT_COM(RX_BG_3_LB_TRUNC_FRAME) : 0;
-
-#undef GET_STAT
-#undef GET_STAT_COM
-}
-
-/**
* t4_wol_magic_enable - enable/disable magic packet WoL
* @adap: the adapter
* @port: the physical port index
@@ -2584,30 +2245,6 @@ int t4_alloc_vi(struct adapter *adap, un
}
/**
- * t4_free_vi - free a virtual interface
- * @adap: the adapter
- * @mbox: mailbox to use for the FW command
- * @pf: the PF owning the VI
- * @vf: the VF owning the VI
- * @viid: virtual interface identifiler
- *
- * Free a previously allocated virtual interface.
- */
-int t4_free_vi(struct adapter *adap, unsigned int mbox, unsigned int pf,
- unsigned int vf, unsigned int viid)
-{
- struct fw_vi_cmd c;
-
- memset(&c, 0, sizeof(c));
- c.op_to_vfn = htonl(FW_CMD_OP(FW_VI_CMD) | FW_CMD_REQUEST |
- FW_CMD_EXEC | FW_VI_CMD_PFN(pf) |
- FW_VI_CMD_VFN(vf));
- c.alloc_to_len16 = htonl(FW_VI_CMD_FREE | FW_LEN16(c));
- c.type_viid = htons(FW_VI_CMD_VIID(viid));
- return t4_wr_mbox(adap, mbox, &c, sizeof(c), &c);
-}
-
-/**
* t4_set_rxmode - set Rx properties of a virtual interface
* @adap: the adapter
* @mbox: mailbox to use for the FW command
@@ -2832,37 +2469,6 @@ int t4_identify_port(struct adapter *ada
return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
}
-/**
- * t4_iq_start_stop - enable/disable an ingress queue and its FLs
- * @adap: the adapter
- * @mbox: mailbox to use for the FW command
- * @start: %true to enable the queues, %false to disable them
- * @pf: the PF owning the queues
- * @vf: the VF owning the queues
- * @iqid: ingress queue id
- * @fl0id: FL0 queue id or 0xffff if no attached FL0
- * @fl1id: FL1 queue id or 0xffff if no attached FL1
- *
- * Starts or stops an ingress queue and its associated FLs, if any.
- */
-int t4_iq_start_stop(struct adapter *adap, unsigned int mbox, bool start,
- unsigned int pf, unsigned int vf, unsigned int iqid,
- unsigned int fl0id, unsigned int fl1id)
-{
- struct fw_iq_cmd c;
-
- memset(&c, 0, sizeof(c));
- c.op_to_vfn = htonl(FW_CMD_OP(FW_IQ_CMD) | FW_CMD_REQUEST |
- FW_CMD_EXEC | FW_IQ_CMD_PFN(pf) |
- FW_IQ_CMD_VFN(vf));
- c.alloc_to_len16 = htonl(FW_IQ_CMD_IQSTART(start) |
- FW_IQ_CMD_IQSTOP(!start) | FW_LEN16(c));
- c.iqid = htons(iqid);
- c.fl0id = htons(fl0id);
- c.fl1id = htons(fl1id);
- return t4_wr_mbox(adap, mbox, &c, sizeof(c), NULL);
-}
-
/**
* t4_iq_free - free an ingress queue and its FLs
* @adap: the adapter
^ permalink raw reply
* [PATCH 1/3] cxgb3: function namespace cleanup
From: Stephen Hemminger @ 2010-10-15 22:43 UTC (permalink / raw)
To: Divy Le Ray, David S. Miller, Casey Leedom, Dimitris Michailidis; +Cc: netdev
In-Reply-To: <20101015224309.179898823@vyatta.com>
[-- Attachment #1: cxgb3-local.patch --]
[-- Type: text/plain, Size: 18193 bytes --]
Make local functions static. Remove functions that are
defined and never used. Compile tested only.
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
---
drivers/net/cxgb3/adapter.h | 3
drivers/net/cxgb3/common.h | 18 ---
drivers/net/cxgb3/cxgb3_defs.h | 3
drivers/net/cxgb3/cxgb3_offload.c | 9 +
drivers/net/cxgb3/mc5.c | 38 -------
drivers/net/cxgb3/sge.c | 39 -------
drivers/net/cxgb3/t3_hw.c | 197 ++------------------------------------
7 files changed, 18 insertions(+), 289 deletions(-)
--- a/drivers/net/cxgb3/common.h 2010-10-15 11:13:45.087851624 -0700
+++ b/drivers/net/cxgb3/common.h 2010-10-15 11:24:41.425577576 -0700
@@ -673,7 +673,6 @@ void t3_xgm_intr_enable(struct adapter *
void t3_xgm_intr_disable(struct adapter *adapter, int idx);
void t3_port_intr_enable(struct adapter *adapter, int idx);
void t3_port_intr_disable(struct adapter *adapter, int idx);
-void t3_port_intr_clear(struct adapter *adapter, int idx);
int t3_slow_intr_handler(struct adapter *adapter);
int t3_phy_intr_handler(struct adapter *adapter);
@@ -689,14 +688,10 @@ int t3_check_tpsram_version(struct adapt
int t3_check_tpsram(struct adapter *adapter, const u8 *tp_ram,
unsigned int size);
int t3_set_proto_sram(struct adapter *adap, const u8 *data);
-int t3_read_flash(struct adapter *adapter, unsigned int addr,
- unsigned int nwords, u32 *data, int byte_oriented);
int t3_load_fw(struct adapter *adapter, const u8 * fw_data, unsigned int size);
int t3_get_fw_version(struct adapter *adapter, u32 *vers);
int t3_check_fw_version(struct adapter *adapter);
int t3_init_hw(struct adapter *adapter, u32 fw_params);
-void mac_prep(struct cmac *mac, struct adapter *adapter, int index);
-void early_hw_init(struct adapter *adapter, const struct adapter_info *ai);
int t3_reset_adapter(struct adapter *adapter);
int t3_prep_adapter(struct adapter *adapter, const struct adapter_info *ai,
int reset);
@@ -706,8 +701,6 @@ void t3_fatal_err(struct adapter *adapte
void t3_set_vlan_accel(struct adapter *adapter, unsigned int ports, int on);
void t3_config_rss(struct adapter *adapter, unsigned int rss_config,
const u8 * cpus, const u16 *rspq);
-int t3_read_rss(struct adapter *adapter, u8 * lkup, u16 *map);
-int t3_mps_set_active_ports(struct adapter *adap, unsigned int port_mask);
int t3_cim_ctl_blk_read(struct adapter *adap, unsigned int addr,
unsigned int n, unsigned int *valp);
int t3_mc7_bd_read(struct mc7 *mc7, unsigned int start, unsigned int n,
@@ -731,19 +724,12 @@ void t3_mc5_prep(struct adapter *adapter
int t3_mc5_init(struct mc5 *mc5, unsigned int nservers, unsigned int nfilters,
unsigned int nroutes);
void t3_mc5_intr_handler(struct mc5 *mc5);
-int t3_read_mc5_range(const struct mc5 *mc5, unsigned int start, unsigned int n,
- u32 *buf);
-int t3_tp_set_coalescing_size(struct adapter *adap, unsigned int size, int psh);
-void t3_tp_set_max_rxsize(struct adapter *adap, unsigned int size);
void t3_tp_set_offload_mode(struct adapter *adap, int enable);
void t3_tp_get_mib_stats(struct adapter *adap, struct tp_mib_stats *tps);
void t3_load_mtus(struct adapter *adap, unsigned short mtus[NMTUS],
unsigned short alpha[NCCTRL_WIN],
unsigned short beta[NCCTRL_WIN], unsigned short mtu_cap);
-void t3_read_hw_mtus(struct adapter *adap, unsigned short mtus[NMTUS]);
-void t3_get_cong_cntl_tab(struct adapter *adap,
- unsigned short incr[NMTUS][NCCTRL_WIN]);
void t3_config_trace_filter(struct adapter *adapter,
const struct trace_params *tp, int filter_index,
int invert, int enable);
@@ -769,10 +755,6 @@ int t3_sge_enable_ecntxt(struct adapter
int t3_sge_disable_fl(struct adapter *adapter, unsigned int id);
int t3_sge_disable_rspcntxt(struct adapter *adapter, unsigned int id);
int t3_sge_disable_cqcntxt(struct adapter *adapter, unsigned int id);
-int t3_sge_read_ecntxt(struct adapter *adapter, unsigned int id, u32 data[4]);
-int t3_sge_read_fl(struct adapter *adapter, unsigned int id, u32 data[4]);
-int t3_sge_read_cq(struct adapter *adapter, unsigned int id, u32 data[4]);
-int t3_sge_read_rspq(struct adapter *adapter, unsigned int id, u32 data[4]);
int t3_sge_cqcntxt_op(struct adapter *adapter, unsigned int id, unsigned int op,
unsigned int credits);
--- a/drivers/net/cxgb3/cxgb3_defs.h 2010-10-15 11:17:35.345242098 -0700
+++ b/drivers/net/cxgb3/cxgb3_defs.h 2010-10-15 11:28:15.233294035 -0700
@@ -43,8 +43,6 @@
void *cxgb_alloc_mem(unsigned long size);
void cxgb_free_mem(void *addr);
-void cxgb_neigh_update(struct neighbour *neigh);
-void cxgb_redirect(struct dst_entry *old, struct dst_entry *new);
/*
* Map an ATID or STID to their entries in the corresponding TID tables.
@@ -111,7 +109,6 @@ static inline struct t3c_tid_entry *look
return &e->t3c_tid;
}
-int process_rx(struct t3cdev *dev, struct sk_buff **skbs, int n);
int attach_t3cdev(struct t3cdev *dev);
void detach_t3cdev(struct t3cdev *dev);
#endif
--- a/drivers/net/cxgb3/cxgb3_offload.c 2010-10-15 11:12:57.413912920 -0700
+++ b/drivers/net/cxgb3/cxgb3_offload.c 2010-10-15 11:28:04.412900334 -0700
@@ -60,6 +60,9 @@ static LIST_HEAD(adapter_list);
static const unsigned int MAX_ATIDS = 64 * 1024;
static const unsigned int ATID_BASE = 0x10000;
+static void cxgb_neigh_update(struct neighbour *neigh);
+static void cxgb_redirect(struct dst_entry *old, struct dst_entry *new);
+
static inline int offload_activated(struct t3cdev *tdev)
{
const struct adapter *adapter = tdev2adap(tdev);
@@ -1015,7 +1018,7 @@ EXPORT_SYMBOL(t3_register_cpl_handler);
/*
* T3CDEV's receive method.
*/
-int process_rx(struct t3cdev *dev, struct sk_buff **skbs, int n)
+static int process_rx(struct t3cdev *dev, struct sk_buff **skbs, int n)
{
while (n--) {
struct sk_buff *skb = *skbs++;
@@ -1070,7 +1073,7 @@ static int is_offloading(struct net_devi
return 0;
}
-void cxgb_neigh_update(struct neighbour *neigh)
+static void cxgb_neigh_update(struct neighbour *neigh)
{
struct net_device *dev = neigh->dev;
@@ -1104,7 +1107,7 @@ static void set_l2t_ix(struct t3cdev *td
tdev->send(tdev, skb);
}
-void cxgb_redirect(struct dst_entry *old, struct dst_entry *new)
+static void cxgb_redirect(struct dst_entry *old, struct dst_entry *new)
{
struct net_device *olddev, *newdev;
struct tid_info *ti;
--- a/drivers/net/cxgb3/mc5.c 2010-10-15 11:12:49.041572658 -0700
+++ b/drivers/net/cxgb3/mc5.c 2010-10-15 11:15:00.746932380 -0700
@@ -374,44 +374,6 @@ int t3_mc5_init(struct mc5 *mc5, unsigne
return err;
}
-/*
- * read_mc5_range - dump a part of the memory managed by MC5
- * @mc5: the MC5 handle
- * @start: the start address for the dump
- * @n: number of 72-bit words to read
- * @buf: result buffer
- *
- * Read n 72-bit words from MC5 memory from the given start location.
- */
-int t3_read_mc5_range(const struct mc5 *mc5, unsigned int start,
- unsigned int n, u32 *buf)
-{
- u32 read_cmd;
- int err = 0;
- struct adapter *adap = mc5->adapter;
-
- if (mc5->part_type == IDT75P52100)
- read_cmd = IDT_CMD_READ;
- else if (mc5->part_type == IDT75N43102)
- read_cmd = IDT4_CMD_READ;
- else
- return -EINVAL;
-
- mc5_dbgi_mode_enable(mc5);
-
- while (n--) {
- t3_write_reg(adap, A_MC5_DB_DBGI_REQ_ADDR0, start++);
- if (mc5_cmd_write(adap, read_cmd)) {
- err = -EIO;
- break;
- }
- dbgi_rd_rsp3(adap, buf + 2, buf + 1, buf);
- buf += 3;
- }
-
- mc5_dbgi_mode_disable(mc5);
- return 0;
-}
#define MC5_INT_FATAL (F_PARITYERR | F_REQQPARERR | F_DISPQPARERR)
--- a/drivers/net/cxgb3/t3_hw.c 2010-10-15 11:13:07.590326587 -0700
+++ b/drivers/net/cxgb3/t3_hw.c 2010-10-15 11:26:01.636456578 -0700
@@ -34,6 +34,8 @@
#include "sge_defs.h"
#include "firmware_exports.h"
+static void t3_port_intr_clear(struct adapter *adapter, int idx);
+
/**
* t3_wait_op_done_val - wait until an operation is completed
* @adapter: the adapter performing the operation
@@ -840,8 +842,8 @@ static int flash_wait_op(struct adapter
* (i.e., big-endian), otherwise as 32-bit words in the platform's
* natural endianess.
*/
-int t3_read_flash(struct adapter *adapter, unsigned int addr,
- unsigned int nwords, u32 *data, int byte_oriented)
+static int t3_read_flash(struct adapter *adapter, unsigned int addr,
+ unsigned int nwords, u32 *data, int byte_oriented)
{
int ret;
@@ -2111,7 +2113,7 @@ void t3_port_intr_disable(struct adapter
* Clear port-specific (i.e., MAC and PHY) interrupts for the given
* adapter port.
*/
-void t3_port_intr_clear(struct adapter *adapter, int idx)
+static void t3_port_intr_clear(struct adapter *adapter, int idx)
{
struct cphy *phy = &adap2pinfo(adapter, idx)->phy;
@@ -2484,98 +2486,6 @@ int t3_sge_cqcntxt_op(struct adapter *ad
}
/**
- * t3_sge_read_context - read an SGE context
- * @type: the context type
- * @adapter: the adapter
- * @id: the context id
- * @data: holds the retrieved context
- *
- * Read an SGE egress context. The caller is responsible for ensuring
- * only one context operation occurs at a time.
- */
-static int t3_sge_read_context(unsigned int type, struct adapter *adapter,
- unsigned int id, u32 data[4])
-{
- if (t3_read_reg(adapter, A_SG_CONTEXT_CMD) & F_CONTEXT_CMD_BUSY)
- return -EBUSY;
-
- t3_write_reg(adapter, A_SG_CONTEXT_CMD,
- V_CONTEXT_CMD_OPCODE(0) | type | V_CONTEXT(id));
- if (t3_wait_op_done(adapter, A_SG_CONTEXT_CMD, F_CONTEXT_CMD_BUSY, 0,
- SG_CONTEXT_CMD_ATTEMPTS, 1))
- return -EIO;
- data[0] = t3_read_reg(adapter, A_SG_CONTEXT_DATA0);
- data[1] = t3_read_reg(adapter, A_SG_CONTEXT_DATA1);
- data[2] = t3_read_reg(adapter, A_SG_CONTEXT_DATA2);
- data[3] = t3_read_reg(adapter, A_SG_CONTEXT_DATA3);
- return 0;
-}
-
-/**
- * t3_sge_read_ecntxt - read an SGE egress context
- * @adapter: the adapter
- * @id: the context id
- * @data: holds the retrieved context
- *
- * Read an SGE egress context. The caller is responsible for ensuring
- * only one context operation occurs at a time.
- */
-int t3_sge_read_ecntxt(struct adapter *adapter, unsigned int id, u32 data[4])
-{
- if (id >= 65536)
- return -EINVAL;
- return t3_sge_read_context(F_EGRESS, adapter, id, data);
-}
-
-/**
- * t3_sge_read_cq - read an SGE CQ context
- * @adapter: the adapter
- * @id: the context id
- * @data: holds the retrieved context
- *
- * Read an SGE CQ context. The caller is responsible for ensuring
- * only one context operation occurs at a time.
- */
-int t3_sge_read_cq(struct adapter *adapter, unsigned int id, u32 data[4])
-{
- if (id >= 65536)
- return -EINVAL;
- return t3_sge_read_context(F_CQ, adapter, id, data);
-}
-
-/**
- * t3_sge_read_fl - read an SGE free-list context
- * @adapter: the adapter
- * @id: the context id
- * @data: holds the retrieved context
- *
- * Read an SGE free-list context. The caller is responsible for ensuring
- * only one context operation occurs at a time.
- */
-int t3_sge_read_fl(struct adapter *adapter, unsigned int id, u32 data[4])
-{
- if (id >= SGE_QSETS * 2)
- return -EINVAL;
- return t3_sge_read_context(F_FREELIST, adapter, id, data);
-}
-
-/**
- * t3_sge_read_rspq - read an SGE response queue context
- * @adapter: the adapter
- * @id: the context id
- * @data: holds the retrieved context
- *
- * Read an SGE response queue context. The caller is responsible for
- * ensuring only one context operation occurs at a time.
- */
-int t3_sge_read_rspq(struct adapter *adapter, unsigned int id, u32 data[4])
-{
- if (id >= SGE_QSETS)
- return -EINVAL;
- return t3_sge_read_context(F_RESPONSEQ, adapter, id, data);
-}
-
-/**
* t3_config_rss - configure Rx packet steering
* @adapter: the adapter
* @rss_config: RSS settings (written to TP_RSS_CONFIG)
@@ -2616,42 +2526,6 @@ void t3_config_rss(struct adapter *adapt
}
/**
- * t3_read_rss - read the contents of the RSS tables
- * @adapter: the adapter
- * @lkup: holds the contents of the RSS lookup table
- * @map: holds the contents of the RSS map table
- *
- * Reads the contents of the receive packet steering tables.
- */
-int t3_read_rss(struct adapter *adapter, u8 * lkup, u16 *map)
-{
- int i;
- u32 val;
-
- if (lkup)
- for (i = 0; i < RSS_TABLE_SIZE; ++i) {
- t3_write_reg(adapter, A_TP_RSS_LKP_TABLE,
- 0xffff0000 | i);
- val = t3_read_reg(adapter, A_TP_RSS_LKP_TABLE);
- if (!(val & 0x80000000))
- return -EAGAIN;
- *lkup++ = val;
- *lkup++ = (val >> 8);
- }
-
- if (map)
- for (i = 0; i < RSS_TABLE_SIZE; ++i) {
- t3_write_reg(adapter, A_TP_RSS_MAP_TABLE,
- 0xffff0000 | i);
- val = t3_read_reg(adapter, A_TP_RSS_MAP_TABLE);
- if (!(val & 0x80000000))
- return -EAGAIN;
- *map++ = val;
- }
- return 0;
-}
-
-/**
* t3_tp_set_offload_mode - put TP in NIC/offload mode
* @adap: the adapter
* @enable: 1 to select offload mode, 0 for regular NIC
@@ -2868,7 +2742,8 @@ static void tp_set_timers(struct adapter
*
* Set the receive coalescing size and PSH bit handling.
*/
-int t3_tp_set_coalescing_size(struct adapter *adap, unsigned int size, int psh)
+static int t3_tp_set_coalescing_size(struct adapter *adap,
+ unsigned int size, int psh)
{
u32 val;
@@ -2898,7 +2773,7 @@ int t3_tp_set_coalescing_size(struct ada
* Set TP's max receive size. This is the limit that applies when
* receive coalescing is disabled.
*/
-void t3_tp_set_max_rxsize(struct adapter *adap, unsigned int size)
+static void t3_tp_set_max_rxsize(struct adapter *adap, unsigned int size)
{
t3_write_reg(adap, A_TP_PARA_REG7,
V_PMMAXXFERLEN0(size) | V_PMMAXXFERLEN1(size));
@@ -3018,48 +2893,6 @@ void t3_load_mtus(struct adapter *adap,
}
/**
- * t3_read_hw_mtus - returns the values in the HW MTU table
- * @adap: the adapter
- * @mtus: where to store the HW MTU values
- *
- * Reads the HW MTU table.
- */
-void t3_read_hw_mtus(struct adapter *adap, unsigned short mtus[NMTUS])
-{
- int i;
-
- for (i = 0; i < NMTUS; ++i) {
- unsigned int val;
-
- t3_write_reg(adap, A_TP_MTU_TABLE, 0xff000000 | i);
- val = t3_read_reg(adap, A_TP_MTU_TABLE);
- mtus[i] = val & 0x3fff;
- }
-}
-
-/**
- * t3_get_cong_cntl_tab - reads the congestion control table
- * @adap: the adapter
- * @incr: where to store the alpha values
- *
- * Reads the additive increments programmed into the HW congestion
- * control table.
- */
-void t3_get_cong_cntl_tab(struct adapter *adap,
- unsigned short incr[NMTUS][NCCTRL_WIN])
-{
- unsigned int mtu, w;
-
- for (mtu = 0; mtu < NMTUS; ++mtu)
- for (w = 0; w < NCCTRL_WIN; ++w) {
- t3_write_reg(adap, A_TP_CCTRL_TABLE,
- 0xffff0000 | (mtu << 5) | w);
- incr[mtu][w] = t3_read_reg(adap, A_TP_CCTRL_TABLE) &
- 0x1fff;
- }
-}
-
-/**
* t3_tp_get_mib_stats - read TP's MIB counters
* @adap: the adapter
* @tps: holds the returned counter values
@@ -3223,15 +3056,6 @@ static int tp_init(struct adapter *adap,
return busy;
}
-int t3_mps_set_active_ports(struct adapter *adap, unsigned int port_mask)
-{
- if (port_mask & ~((1 << adap->params.nports) - 1))
- return -EINVAL;
- t3_set_reg_field(adap, A_MPS_CFG, F_PORT1ACTIVE | F_PORT0ACTIVE,
- port_mask << S_PORT0ACTIVE);
- return 0;
-}
-
/*
* Perform the bits of HW initialization that are dependent on the Tx
* channels being used.
@@ -3687,7 +3511,7 @@ static void mc7_prep(struct adapter *ada
mc7->width = G_WIDTH(cfg);
}
-void mac_prep(struct cmac *mac, struct adapter *adapter, int index)
+static void mac_prep(struct cmac *mac, struct adapter *adapter, int index)
{
u16 devid;
@@ -3707,7 +3531,8 @@ void mac_prep(struct cmac *mac, struct a
}
}
-void early_hw_init(struct adapter *adapter, const struct adapter_info *ai)
+static void early_hw_init(struct adapter *adapter,
+ const struct adapter_info *ai)
{
u32 val = V_PORTSPEED(is_10G(adapter) ? 3 : 2);
--- a/drivers/net/cxgb3/adapter.h 2010-10-15 11:29:31.428075569 -0700
+++ b/drivers/net/cxgb3/adapter.h 2010-10-15 11:29:46.280619610 -0700
@@ -336,9 +336,6 @@ int t3_sge_alloc_qset(struct adapter *ad
int irq_vec_idx, const struct qset_params *p,
int ntxq, struct net_device *dev,
struct netdev_queue *netdevq);
-int t3_get_desc(const struct sge_qset *qs, unsigned int qnum, unsigned int idx,
- unsigned char *data);
-irqreturn_t t3_sge_intr_msix(int irq, void *cookie);
extern struct workqueue_struct *cxgb3_wq;
int t3_get_edc_fw(struct cphy *phy, int edc_idx, int size);
--- a/drivers/net/cxgb3/sge.c 2010-10-15 11:13:02.710128196 -0700
+++ b/drivers/net/cxgb3/sge.c 2010-10-15 11:30:17.141751919 -0700
@@ -2554,7 +2554,7 @@ static inline int handle_responses(struc
* The MSI-X interrupt handler for an SGE response queue for the non-NAPI case
* (i.e., response queue serviced in hard interrupt).
*/
-irqreturn_t t3_sge_intr_msix(int irq, void *cookie)
+static irqreturn_t t3_sge_intr_msix(int irq, void *cookie)
{
struct sge_qset *qs = cookie;
struct adapter *adap = qs->adap;
@@ -3320,40 +3320,3 @@ void t3_sge_prep(struct adapter *adap, s
spin_lock_init(&adap->sge.reg_lock);
}
-
-/**
- * t3_get_desc - dump an SGE descriptor for debugging purposes
- * @qs: the queue set
- * @qnum: identifies the specific queue (0..2: Tx, 3:response, 4..5: Rx)
- * @idx: the descriptor index in the queue
- * @data: where to dump the descriptor contents
- *
- * Dumps the contents of a HW descriptor of an SGE queue. Returns the
- * size of the descriptor.
- */
-int t3_get_desc(const struct sge_qset *qs, unsigned int qnum, unsigned int idx,
- unsigned char *data)
-{
- if (qnum >= 6)
- return -EINVAL;
-
- if (qnum < 3) {
- if (!qs->txq[qnum].desc || idx >= qs->txq[qnum].size)
- return -EINVAL;
- memcpy(data, &qs->txq[qnum].desc[idx], sizeof(struct tx_desc));
- return sizeof(struct tx_desc);
- }
-
- if (qnum == 3) {
- if (!qs->rspq.desc || idx >= qs->rspq.size)
- return -EINVAL;
- memcpy(data, &qs->rspq.desc[idx], sizeof(struct rsp_desc));
- return sizeof(struct rsp_desc);
- }
-
- qnum -= 4;
- if (!qs->fl[qnum].desc || idx >= qs->fl[qnum].size)
- return -EINVAL;
- memcpy(data, &qs->fl[qnum].desc[idx], sizeof(struct rx_desc));
- return sizeof(struct rx_desc);
-}
^ permalink raw reply
* [PATCH 3/3] cxgb4vf: function namespace cleanup
From: Stephen Hemminger @ 2010-10-15 22:43 UTC (permalink / raw)
To: Divy Le Ray, David S. Miller, Casey Leedom, Dimitris Michailidis; +Cc: netdev
In-Reply-To: <20101015224309.179898823@vyatta.com>
[-- Attachment #1: cxgb4vf-local.patch --]
[-- Type: text/plain, Size: 2603 bytes --]
Where possible make functions local.
Compile tested only
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
---
drivers/net/cxgb4vf/sge.c | 6 +++---
drivers/net/cxgb4vf/t4vf_common.h | 1 -
drivers/net/cxgb4vf/t4vf_hw.c | 4 ++--
3 files changed, 5 insertions(+), 6 deletions(-)
--- a/drivers/net/cxgb4vf/sge.c 2010-10-15 13:35:37.841741143 -0700
+++ b/drivers/net/cxgb4vf/sge.c 2010-10-15 13:37:26.753998981 -0700
@@ -1361,7 +1361,7 @@ out_free:
* Releases the pages of a packet gather list. We do not own the last
* page on the list and do not free it.
*/
-void t4vf_pktgl_free(const struct pkt_gl *gl)
+static void t4vf_pktgl_free(const struct pkt_gl *gl)
{
int frag;
@@ -1636,7 +1636,7 @@ static inline void rspq_next(struct sge_
* on this queue. If the system is under memory shortage use a fairly
* long delay to help recovery.
*/
-int process_responses(struct sge_rspq *rspq, int budget)
+static int process_responses(struct sge_rspq *rspq, int budget)
{
struct sge_eth_rxq *rxq = container_of(rspq, struct sge_eth_rxq, rspq);
int budget_left = budget;
@@ -1888,7 +1888,7 @@ static unsigned int process_intrq(struct
* The MSI interrupt handler handles data events from SGE response queues as
* well as error and other async events as they all use the same MSI vector.
*/
-irqreturn_t t4vf_intr_msi(int irq, void *cookie)
+static irqreturn_t t4vf_intr_msi(int irq, void *cookie)
{
struct adapter *adapter = cookie;
--- a/drivers/net/cxgb4vf/t4vf_common.h 2010-10-15 13:38:12.555553059 -0700
+++ b/drivers/net/cxgb4vf/t4vf_common.h 2010-10-15 13:38:30.716055176 -0700
@@ -235,7 +235,6 @@ static inline int t4vf_wr_mbox_ns(struct
int __devinit t4vf_wait_dev_ready(struct adapter *);
int __devinit t4vf_port_init(struct adapter *, int);
-int t4vf_query_params(struct adapter *, unsigned int, const u32 *, u32 *);
int t4vf_set_params(struct adapter *, unsigned int, const u32 *, const u32 *);
int t4vf_get_sge_params(struct adapter *);
--- a/drivers/net/cxgb4vf/t4vf_hw.c 2010-10-15 13:35:44.638006598 -0700
+++ b/drivers/net/cxgb4vf/t4vf_hw.c 2010-10-15 13:38:04.503330665 -0700
@@ -335,8 +335,8 @@ int __devinit t4vf_port_init(struct adap
* Reads the values of firmware or device parameters. Up to 7 parameters
* can be queried at once.
*/
-int t4vf_query_params(struct adapter *adapter, unsigned int nparams,
- const u32 *params, u32 *vals)
+static int t4vf_query_params(struct adapter *adapter, unsigned int nparams,
+ const u32 *params, u32 *vals)
{
int i, ret;
struct fw_params_cmd cmd, rpl;
^ permalink raw reply
* [PATCH 0/3] Chelsio driver namespace cleanups
From: Stephen Hemminger @ 2010-10-15 22:43 UTC (permalink / raw)
To: Divy Le Ray, David S. Miller, Casey Leedom, Dimitris Michailidis; +Cc: netdev
Cleanup functions and dead code in Chelsio drivers
^ permalink raw reply
* Re: [Bonding-devel] [PATCH net-next] bonding: make release_and_destroy static
From: Jay Vosburgh @ 2010-10-15 23:16 UTC (permalink / raw)
To: Andy Gospodarek; +Cc: Stephen Hemminger, netdev, David Miller, bonding-devel
In-Reply-To: <20101015153725.GC7497@gospo.rdu.redhat.com>
Andy Gospodarek <andy@greyhouse.net> wrote:
>On Fri, Oct 15, 2010 at 08:09:34AM -0700, Stephen Hemminger wrote:
>> Only used in main file.
>>
>> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
>>
>> --- a/drivers/net/bonding/bond_main.c 2010-10-15 08:07:14.163898236 -0700
>> +++ b/drivers/net/bonding/bond_main.c 2010-10-15 08:07:31.956373660 -0700
>> @@ -2057,8 +2057,8 @@ int bond_release(struct net_device *bond
>> * First release a slave and than destroy the bond if no more slaves are left.
>> * Must be under rtnl_lock when this function is called.
>> */
>> -int bond_release_and_destroy(struct net_device *bond_dev,
>> - struct net_device *slave_dev)
>> +static int bond_release_and_destroy(struct net_device *bond_dev,
>> + struct net_device *slave_dev)
>> {
>> struct bonding *bond = netdev_priv(bond_dev);
>> int ret;
>> --- a/drivers/net/bonding/bonding.h 2010-10-15 08:07:14.179898632 -0700
>> +++ b/drivers/net/bonding/bonding.h 2010-10-15 08:07:31.956373660 -0700
>> @@ -334,7 +334,6 @@ static inline void bond_unset_master_alb
>> struct vlan_entry *bond_next_vlan(struct bonding *bond, struct vlan_entry *curr);
>> int bond_dev_queue_xmit(struct bonding *bond, struct sk_buff *skb, struct net_device *slave_dev);
>> int bond_create(struct net *net, const char *name);
>> -int bond_release_and_destroy(struct net_device *bond_dev, struct net_device *slave_dev);
>> int bond_create_sysfs(void);
>> void bond_destroy_sysfs(void);
>> void bond_prepare_sysfs_group(struct bonding *bond);
>
>Seems fine.
>
>Acked-by: Andy Gospodarek <andy@greyhouse.net>
Signed-off-by: Jay Vosburgh <fubar@us.ibm.com>
-J
---
-Jay Vosburgh, IBM Linux Technology Center, fubar@us.ibm.com
^ permalink raw reply
* Re: [PATCH net-next] bonding: make bond_resend_igmp_join_requests_delayed static
From: Jay Vosburgh @ 2010-10-15 23:15 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: David Miller, netdev, bonding-devel
In-Reply-To: <20101015140256.4192fd34@nehalam>
Stephen Hemminger <shemminger@vyatta.com> wrote:
>Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
>
>--- a/drivers/net/bonding/bond_main.c 2010-10-15 13:52:01.747192520 -0700
>+++ b/drivers/net/bonding/bond_main.c 2010-10-15 13:52:39.004286643 -0700
>@@ -914,7 +914,7 @@ static void bond_resend_igmp_join_reques
> read_unlock(&bond->lock);
> }
>
>-void bond_resend_igmp_join_requests_delayed(struct work_struct *work)
>+static void bond_resend_igmp_join_requests_delayed(struct work_struct *work)
> {
> struct bonding *bond = container_of(work, struct bonding,
> mcast_work.work);
Signed-off-by: Jay Vosburgh <fubar@us.ibm.com>
-J
---
-Jay Vosburgh, IBM Linux Technology Center, fubar@us.ibm.com
^ permalink raw reply
* Re: [Bugme-new] [Bug 19692] New: linux-2.6.36-rc5 crash with gianfar ethernet at full line rate traffic
From: emin ak @ 2010-10-15 23:14 UTC (permalink / raw)
To: Jarek Poplawski
Cc: Andrew Morton, netdev, bugzilla-daemon, bugme-daemon,
Anton Vorontsov
In-Reply-To: <20101015085853.GA8091@ff.dom.local>
> Hi Emin,
> Are there any problems with this testing?
>
> Jarek P.
>
Hi Jarek.
Sorry for delayed answer. As I promised, I have started the tests on
Monday (in spite of dealing with The Monday Syndrome:) I had applied
your patch and after two billions packet (and approximatly four hours)
passed kernel crashed with skb_over_panic error similar with first
type. To ensure the patch is failed or not, I rerun the same test
again. That time, surprisingly, it did'nt crashed again for two days
with same kernel. But this situation had occured before, I think
sometimes because of randomness of the applied ethernet traffic and
mostly because I cant apply all full line rate random traffic to my
target device because of wrong test setup (switch / hardware packet
generator settings etc..), it takes three or more day to crash the
kernel and sometimes it never crashes. My device only and only crashes
when I can apply full line rate random traffic. Before informing you
and the list with (official) test results, I want to be sure with the
truth of them. So that please let me apply more test to the target
device for a fews day more. After that I wish I'll came with good
news!
Thanks for your time and care alot.
Emin
^ permalink raw reply
* 2.6.36-rc7: net/bridge causes temporary network I/O lockups
From: Patrick Ringl @ 2010-10-15 23:13 UTC (permalink / raw)
To: netdev; +Cc: linux-kernel
Hi,
after I recently switched from 2.6.32 to 2.6.35 (and for testing to
2.6.36-rc7) I had massive issues with temporarily occurring freezes
regarding the whole network stack.
The freezes are occurring randomly and usually take 20-30 seconds until
the system is responsive again (in addition locally thus with a screen
and keyboard attached the system is still fully functional).
I noticed that this behavior only occurs once I have a bridge set up for
KVM (with one local interface configured as port, fd and maxwait set to
0). If I disable the bridge and configure the interfaces with an IP,
things are back to normal and thus everything works fine.
The network hardware in question was an nforce onboard controller (using
dethforce) and the 2nd interface I have the exact same issue with is a
realtek using r8169.
So here it is: Could commit 573201f36fd9c7c6d5218cdcd9948cee700b277d (
partially disabling netpoll support) be the issue for the problem I am
currently facing? If not, what could it be then?
Please CC to me since I am not subscribed! :-)
regards,
Patrick
^ permalink raw reply
* 2.6.36-rc7: net/bridge causes temporary network I/O lockups
From: Patrick Ringl @ 2010-10-15 23:04 UTC (permalink / raw)
To: netdev; +Cc: herbert, bridge, linux-kernel
[-- Attachment #1.1: Type: text/plain, Size: 1091 bytes --]
Hi,
after I recently switched from 2.6.32 to 2.6.35 (and for testing to
2.6.36-rc7) I had massive issues with temporarily occurring freezes
regarding the whole network stack.
The freezes are occurring randomly and usually take 20-30 seconds until
the system is responsive again (in addition locally thus with a screen
and keyboard attached the system is still fully functional).
I noticed that this behavior only occurs once I have a bridge set up for
KVM (with one local interface configured as port, fd and maxwait set to
0). If I disable the bridge and configure the interfaces with an IP,
things are back to normal and thus everything works fine.
The network hardware in question was an nforce onboard controller (using
dethforce) and the 2nd interface I have the exact same issue with is a
realtek using r8169.
So here it is: Could commit 573201f36fd9c7c6d5218cdcd9948cee700b277d (
partially disabling netpoll support) be the issue for the problem I am
currently facing? If not, what could it be then?
Please CC to me since I am not subscribed! :-)
regards,
Patrick
[-- Attachment #1.2: Type: text/html, Size: 2246 bytes --]
[-- Attachment #2: Type: text/plain, Size: 160 bytes --]
_______________________________________________
Bridge mailing list
Bridge@lists.linux-foundation.org
https://lists.linux-foundation.org/mailman/listinfo/bridge
^ permalink raw reply
* Message From Dr. Paul Blair
From: Dr. Paul Blair @ 2010-10-15 22:40 UTC (permalink / raw)
--
Greetings,
This message may come to you as a surprise, because we have never met
before now.
I am Dr. Paul Blair, I am a Senior Director with the Royal Bank of
Scotland. There is the sum of $20,600,000.00 in my Bank {Royal Bank of
Scotland} United Kingdom, But, there were no beneficiaries stated
concerning these funds which means no one would ever come forward to
claim it.
This is why i am requesting for your Partnership, so we can have this
sum transfered out of my Royal Bank of Scotland into your Bank Account
or any other account of your choice.I will be pleased to see if you
can help me and also be a good and Trusted person. Once the funds have
been transferred to your Nominated Bank Account we shall then share in
the ratio of 60% for me, 40% for you.
Send me an email to my private email address: pau1957@gncn.net if you
are interested in assisting me, so i can give you more details.
This is a great Life time opportunity for both of us. IT IS 100% RISK FREE.
Regards
Dr. Paul Blair
^ permalink raw reply
* Re: tbf/htb qdisc limitations
From: Jarek Poplawski @ 2010-10-15 22:05 UTC (permalink / raw)
To: Bill Fink; +Cc: Eric Dumazet, Rick Jones, Steven Brudenell, netdev
In-Reply-To: <20101015173746.12c7c40a.billfink@mindspring.com>
On Fri, Oct 15, 2010 at 05:37:46PM -0400, Bill Fink wrote:
...
> i7test7% tc -s -d qdisc show dev eth2
> qdisc prio 1: root refcnt 33 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
> Sent 11028687119 bytes 1223828 pkt (dropped 293, overlimits 0 requeues 0)
> backlog 0b 0p requeues 0
> qdisc tbf 10: parent 1:1 rate 8900Mbit burst 1112500b/64 mpu 0b lat 4295.0s
> Sent 11028687077 bytes 1223827 pkt (dropped 293, overlimits 593 requeues 0)
> backlog 0b 0p requeues 0
>
> I'm not sure how you can have so many dropped but not have
> any TCP retransmissions (or not show up as requeues). But
> there's probably something basic I just don't understand
> about how all this stuff works.
Me either, but it seems higher "limit" might help with these drops.
Jarek P.
^ permalink raw reply
* Re: tbf/htb qdisc limitations
From: Bill Fink @ 2010-10-15 21:37 UTC (permalink / raw)
To: Eric Dumazet; +Cc: Jarek Poplawski, Rick Jones, Steven Brudenell, netdev
In-Reply-To: <1287125059.2659.1812.camel@edumazet-laptop>
On Fri, 15 Oct 2010, Eric Dumazet wrote:
> Le vendredi 15 octobre 2010 à 02:37 -0400, Bill Fink a écrit :
> > On Thu, 14 Oct 2010, Jarek Poplawski wrote:
> >
> > > On Thu, Oct 14, 2010 at 08:09:39AM +0000, Jarek Poplawski wrote:
> > > > On Thu, Oct 14, 2010 at 03:13:54AM -0400, Bill Fink wrote:
> > > > > TSO/GSO was disabled and was using 9000-byte jumbo frames
> > > > > (and specified mtu 9000 to tc command).
> > > > >
> > > > > Here was one attempt I made using tbf:
> > > > >
> > > > > tc qdisc add dev eth2 root handle 1: prio
> > > > > tc qdisc add dev eth2 parent 1:1 handle 10: tbf rate 8900mbit buffer 1112500 limit 10000 mtu 9000
> > > > > tc filter add dev eth2 protocol ip parent 1: prio 1 u32 match ip dst 192.168.1.23 flowid 10:1
> > > > >
> > > > > I tried many variations of the above, all without success.
> > > >
> > > > The main problem are smaller packets. If you had (almost) only 9000b
> > > > frames this probably could work. [...]
> > >
> > > On the other hand, e.g. the limit above seems too low wrt mtu & rate.
> >
> > Actually, I discovered my commands above work just fine on
> > a 2.6.35 box:
> >
> > i7test7% nuttcp -T10 -i1 192.168.1.17
> > 1045.3125 MB / 1.00 sec = 8768.3573 Mbps 0 retrans
> > 1045.6875 MB / 1.00 sec = 8772.0292 Mbps 0 retrans
> > 1049.5625 MB / 1.00 sec = 8804.2627 Mbps 0 retrans
> > 1043.1875 MB / 1.00 sec = 8750.9960 Mbps 0 retrans
> > 1048.6875 MB / 1.00 sec = 8796.3246 Mbps 0 retrans
> > 1033.4375 MB / 1.00 sec = 8669.3188 Mbps 0 retrans
> > 1040.7500 MB / 1.00 sec = 8730.7057 Mbps 0 retrans
> > 1047.0000 MB / 1.00 sec = 8783.2063 Mbps 0 retrans
> > 1040.0000 MB / 1.00 sec = 8724.0564 Mbps 0 retrans
> > 1037.4375 MB / 1.00 sec = 8702.5434 Mbps 0 retrans
> >
> > 10431.5608 MB / 10.00 sec = 8749.7542 Mbps 25 %TX 35 %RX 0 retrans 0.11 msRTT
> >
> > The problems I encountered were on a field system running
> > 2.6.30.10. I will investigate upgrading the field system
> > to 2.6.35.
> >
>
> Yes, I noticed same thing for me on net-next-2.6
>
> Please report :
>
> tc -s -d qdisc
Not sure why you want this on the older 2.6.30.10 kernel,
but here it is:
i7test6% nuttcp -T10 -i1 192.168.1.14
1169.1875 MB / 1.00 sec = 9807.2868 Mbps 0 retrans
1181.1875 MB / 1.00 sec = 9908.9054 Mbps 0 retrans
1181.1250 MB / 1.00 sec = 9907.9253 Mbps 0 retrans
1181.1875 MB / 1.00 sec = 9908.4991 Mbps 0 retrans
1180.6875 MB / 1.00 sec = 9904.3345 Mbps 0 retrans
1181.1250 MB / 1.00 sec = 9908.0838 Mbps 0 retrans
1181.1875 MB / 1.00 sec = 9908.4099 Mbps 0 retrans
1181.0625 MB / 1.00 sec = 9907.3911 Mbps 0 retrans
1181.3750 MB / 1.00 sec = 9910.2801 Mbps 0 retrans
1181.1875 MB / 1.00 sec = 9908.2118 Mbps 0 retrans
11801.1382 MB / 10.04 sec = 9858.7159 Mbps 24 %TX 40 %RX 0 retrans 0.11 msRTT
i7test6% tc -s -d qdisc show dev eth2
qdisc prio 1: root refcnt 32 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
Sent 12448974085 bytes 1381173 pkt (dropped 266, overlimits 0 requeues 12)
rate 0bit 0pps backlog 0b 0p requeues 12
qdisc tbf 10: parent 1:1 rate 8900Mbit burst 1111387b/64 mpu 0b lat 4295.0s
Sent 12448974043 bytes 1381172 pkt (dropped 266, overlimits 0 requeues 0)
rate 0bit 0pps backlog 0b 0p requeues 0
I'm guessing this is probably related to the schedulers
time resolution issue that Jarek mentioned.
And for completeness, here's the info for the working
2.6.35 case:
i7test7% nuttcp -T10 -i1 192.168.1.17
1045.5625 MB / 1.00 sec = 8770.6210 Mbps 0 retrans
1032.1875 MB / 1.00 sec = 8658.3825 Mbps 0 retrans
1039.8125 MB / 1.00 sec = 8722.7801 Mbps 0 retrans
1050.2500 MB / 1.00 sec = 8810.0739 Mbps 0 retrans
1050.6875 MB / 1.00 sec = 8813.9378 Mbps 0 retrans
1048.8125 MB / 1.00 sec = 8798.0857 Mbps 0 retrans
1046.1875 MB / 1.00 sec = 8775.9954 Mbps 0 retrans
1045.7500 MB / 1.00 sec = 8771.9307 Mbps 0 retrans
1051.1250 MB / 1.00 sec = 8817.8900 Mbps 0 retrans
1044.0625 MB / 1.00 sec = 8757.8019 Mbps 0 retrans
10454.7500 MB / 10.00 sec = 8769.2206 Mbps 26 %TX 35 %RX 0 retrans 0.11 msRTT
i7test7% tc -s -d qdisc show dev eth2
qdisc prio 1: root refcnt 33 bands 3 priomap 1 2 2 2 1 2 0 0 1 1 1 1 1 1 1 1
Sent 11028687119 bytes 1223828 pkt (dropped 293, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
qdisc tbf 10: parent 1:1 rate 8900Mbit burst 1112500b/64 mpu 0b lat 4295.0s
Sent 11028687077 bytes 1223827 pkt (dropped 293, overlimits 593 requeues 0)
backlog 0b 0p requeues 0
I'm not sure how you can have so many dropped but not have
any TCP retransmissions (or not show up as requeues). But
there's probably something basic I just don't understand
about how all this stuff works.
-Bill
^ permalink raw reply
* Re: large divisor for flow classifier
From: Jarek Poplawski @ 2010-10-15 21:45 UTC (permalink / raw)
To: Eric Dumazet; +Cc: Jonathan Thibault, Patrick McHardy, netdev
In-Reply-To: <4CB8C341.40000@gmail.com>
Jarek Poplawski wrote:
> Because of low SFQ_DEPTH, which limits its queue to 127 packets,
> SFQ isn't suitable for serving so many users. There is sch_drr as
> a replacement, alas more complex and undocumented [...]
Sorry! Actually there is a man page already!
Kudos to Florian!
Jarek P.
^ permalink raw reply
* Re: [PATCH net-next] bonding: make bond_resend_igmp_join_requests_delayed static
From: Flavio Leitner @ 2010-10-15 21:40 UTC (permalink / raw)
To: Stephen Hemminger; +Cc: David Miller, Jay Vosburgh, netdev, bonding-devel
In-Reply-To: <20101015140256.4192fd34@nehalam>
On Fri, Oct 15, 2010 at 02:02:56PM -0700, Stephen Hemminger wrote:
>
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
>
> --- a/drivers/net/bonding/bond_main.c 2010-10-15 13:52:01.747192520 -0700
> +++ b/drivers/net/bonding/bond_main.c 2010-10-15 13:52:39.004286643 -0700
> @@ -914,7 +914,7 @@ static void bond_resend_igmp_join_reques
> read_unlock(&bond->lock);
> }
>
> -void bond_resend_igmp_join_requests_delayed(struct work_struct *work)
> +static void bond_resend_igmp_join_requests_delayed(struct work_struct *work)
> {
> struct bonding *bond = container_of(work, struct bonding,
> mcast_work.work);
Indeed, thanks.
Acked-by: Flavio Leitner <fleitner@redhat.com>
--
Flavio
^ permalink raw reply
* Re: openvswitch/flow WAS ( Re: [rfc] Merging the Open vSwitch datapath
From: Jesse Gross @ 2010-10-15 21:35 UTC (permalink / raw)
To: hadi; +Cc: Ben Pfaff, netdev
In-Reply-To: <1287142292.3642.19.camel@bigi>
On Fri, Oct 15, 2010 at 4:31 AM, jamal <hadi@cyberus.ca> wrote:
> It seems to me that you reinvented things that exist in
> Linux already such as bridging, tunnels and what really
> caught my attention: ability to do flows (tc actions).
> It is possible Linux is missing something you wanted or was
> not efficient enough?
> [For example: I couldnt see anything you needed
> on flow-action management that Linux couldnt do already
> (with already very nice well structured netlink APIs)]
You're right, at a high level, it appears that there is a bit of an
overlap between bridging, tc, and Open vSwitch. However, in reality
each is targeting a pretty different use case. Given that the design
goals are not aligned, keeping separate things separate actually helps
with overall simplicity. Where there is overlap, I am certainly happy
to see common functionality reused: for example, Open vSwitch uses tc
for its QoS capabilities.
In the future, I expect there to be an even clearer delineation
between the various components. One of the primary use cases of Open
vSwitch at the moment is for virtualized data center networking but a
few of the other potential uses that have been brought up include
security processing (involving sending traffic of interest to
userspace) and configuring SR-IOV NICs (to appropriately program rules
in hardware). You can see how each of these makes sense in the
context of a virtual switch datapath but less so as a set of tc
actions.
So, in short, I don't see this as something lacking in Linux, just
complementary functionality.
^ permalink raw reply
* Re: VLAN packets silently dropped in promiscuous mode
From: Jesse Gross @ 2010-10-15 21:33 UTC (permalink / raw)
To: Guillaume Gaudonville; +Cc: Roger Luethi, netdev, Patrick McHardy
In-Reply-To: <4CB81BF1.1050906@6wind.com>
On Fri, Oct 15, 2010 at 2:16 AM, Guillaume Gaudonville
<guillaume.gaudonville@6wind.com> wrote:
> Jesse Gross wrote:
>>
>> On Thu, Sep 30, 2010 at 1:07 AM, Roger Luethi <rl@hellgate.ch> wrote:
>>
>>>
>>> On Wed, 29 Sep 2010 10:44:26 -0700, Jesse Gross wrote:
>>>
>>>>
>>>> On Wed, Sep 29, 2010 at 4:37 AM, Roger Luethi <rl@hellgate.ch> wrote:
>>>>
>>>>>
>>>>> I noticed packets for unknown VLANs getting silently dropped even in
>>>>> promiscuous mode (this is true only for the hardware accelerated path).
>>>>> netif_nit_deliver was introduced specifically to prevent that, but the
>>>>> function gets called only _after_ packets from unknown VLANs have been
>>>>> dropped.
>>>>>
>>>>
>>>> Some drivers are fixing this on a case by case basis by disabling
>>>> hardware accelerated VLAN stripping when in promiscuous mode, i.e.:
>>>>
>>>> http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=5f6c01819979afbfec7e0b15fe52371b8eed87e8
>>>>
>>>> However, at this point it is more or less random which drivers do
>>>> this. It would obviously be much better if it were consistent.
>>>>
>>>
>>> My understanding is this. Hardware VLAN tagging and stripping can always
>>> be
>>> enabled. The kernel passes 802.1Q information along with the stripped
>>> header to libpcap which reassembles the original header where necessary.
>>> Works for me.
>>>
>>
>> Sorry, I misread your original post as saying that the VLAN header
>> gets dropped, rather than the entire packet. I agree that this is how
>> it should work but not necessarily how it does work (again, depending
>> on the driver). Here's the problem that I was talking about:
>>
>> Most drivers have a snippet of code that looks something like this
>> (taken from ixgbe):
>>
>> if (adapter->vlgrp && is_vlan && (tag & VLAN_VID_MASK))
>> vlan_gro_receive(napi, adapter->vlgrp, tag, skb);
>> else
>> napi_gro_receive(napi, skb);
>>
>> At this point the VLAN has already been stripped in hardware. If
>> there is no VLAN group configured on the device then we hit the second
>> case. The VLAN header was removed from the SKB and the tag variable
>> is unused. It is no longer possible for libpcap to reconstruct the
>> header because the information was thrown away (even the fact that
>> there was a VLAN tag at all).
>>
>> There are a couple ways to fix this:
>>
>> * Turn off VLAN stripping when in promiscuous mode (as done by the ixgbe
>> driver)
>>
>
> This is not totally true: if changing the MTU ixgbe_change_mtu will call:
> ixgbe_reinit_locked--> ixgbe_up --> ixgbe_configure:
> --> ixgbe_set_rx_mode: flag IFF_PROMISC is tested
> ixgbe_vlan_filter_enable is not called
> --> ixgbe_restore_vlan --> ixgbe_vlan_rx_register: flag
> IFF_PROMISC is not tested ixgbe_vlan_filter_enable
> will be called.
>
> In fact it should happen each time we configure something which needs a
> reset of the device. Why don't add a test
> on flag promiscuous directly in ixgbe_vlan_filter_enable? Or do it on each
> call, if we want to allow a device in promiscuous
> mode to enable this feature.
>
> What do you think?
I can believe that there are paths that lead to this not working
correctly. That was actually my larger point: this is something that
is commonly not implemented correctly in drivers. Rather than try to
study every driver my goal is to just avoid the problem completely by
handling vlan acceleration centrally in the networking core. I sent
out an RFC patch series a few days ago that should solve this problem:
http://marc.info/?l=linux-netdev&m=128700022614170&w=3
^ permalink raw reply
* Re: [PATCH net-next 3/5] tipc: Optimizations to bearer enabling logic
From: Paul Gortmaker @ 2010-10-15 21:31 UTC (permalink / raw)
To: Neil Horman; +Cc: davem, netdev, allan.stephens
In-Reply-To: <20101015110033.GC22294@hmsreliant.think-freely.org>
On 10-10-15 07:00 AM, Neil Horman wrote:
[...]
> This definately looks more concise, but I don't see why its necessecary to drop
> the tipc_net_lock around the call to enable_bearer. The only caler of
> tipc_register_media sets the enable_bearer pointer to the enable_bearer
> function, and I' don't see any path through that function which would
> potentially retake that lock. In fact it seems dropping it might be dangerous,
> if other paths (like from cfg_named_msg_event), tried to enable a bearer in
> parallel with a user space directive from the netlink socket). With out the
> protection of tipc_net_lock, you could use the same eth_bearer twice, and
> corrupt that array.
I think it would be protected by config_lock. but in the end if it is
just an academic optimization that really isn't in a hot code path
anyway, and if it just adds more confusion than real world value, then
I'm fine with just dropping this on the floor (and deleting the extra
memset in a cleanup patch) -- it won't be the 1st time doing this with
these carry forward patches, and I'm sure it won't be the last.
Thanks,
Paul.
>
> Neil
>
^ permalink raw reply
* Re: [PATCH net-next] vmxnet3: make bit twiddle routines inline
From: Harvey Harrison @ 2010-10-15 21:22 UTC (permalink / raw)
To: Stephen Hemminger
Cc: Shreyas Bhatewara, David S. Miller, VMware, Inc., netdev
In-Reply-To: <20101015140620.63d0a615@nehalam>
On Fri, Oct 15, 2010 at 2:06 PM, Stephen Hemminger
<shemminger@vyatta.com> wrote:
> +static inline void set_flag_le16(__le16 *data, u16 flag)
> +{
> + *data = cpu_to_le16(le16_to_cpu(*data) | flag);
> +}
> +
Instead of swapping twice on BE machines, why not:
*data |= cpu_to_le16(flag);
Which may even get done away with at compile time if flag is a constant.
Similarly for the others.
Cheers,
Harvey
^ permalink raw reply
* RE: [PATCH net-next] vmxnet3: make bit twiddle routines inline
From: Shreyas Bhatewara @ 2010-10-15 21:14 UTC (permalink / raw)
To: Stephen Hemminger, David S. Miller; +Cc: VMware, Inc., netdev@vger.kernel.org
In-Reply-To: <20101015140620.63d0a615@nehalam>
Thanks for the change Stephen. Looks good.
Acked-by: Shreyas Bhatewara <sbhatewara@vmware.com>
> -----Original Message-----
> From: Stephen Hemminger [mailto:shemminger@vyatta.com]
> Sent: Friday, October 15, 2010 2:06 PM
> To: Shreyas Bhatewara; David S. Miller
> Cc: VMware, Inc.; netdev@vger.kernel.org
> Subject: [PATCH net-next] vmxnet3: make bit twiddle routines inline
>
> Gcc doesn't usually handle inline across compilation units, and the
> functions don't have to be global in scope. Move the set/reset flag
> functions int the existing vmxnet3 header.
>
> Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
>
> ---
> drivers/net/vmxnet3/vmxnet3_drv.c | 17 -----------------
> drivers/net/vmxnet3/vmxnet3_int.h | 17 ++++++++++++++---
> 2 files changed, 14 insertions(+), 20 deletions(-)
>
> --- a/drivers/net/vmxnet3/vmxnet3_drv.c 2010-10-15 13:58:23.378722695
> -0700
> +++ b/drivers/net/vmxnet3/vmxnet3_drv.c 2010-10-15 13:59:32.724873755
> -0700
> @@ -1548,23 +1548,6 @@ vmxnet3_free_irqs(struct vmxnet3_adapter
> }
> }
>
> -
> -inline void set_flag_le16(__le16 *data, u16 flag)
> -{
> - *data = cpu_to_le16(le16_to_cpu(*data) | flag);
> -}
> -
> -inline void set_flag_le64(__le64 *data, u64 flag)
> -{
> - *data = cpu_to_le64(le64_to_cpu(*data) | flag);
> -}
> -
> -inline void reset_flag_le64(__le64 *data, u64 flag)
> -{
> - *data = cpu_to_le64(le64_to_cpu(*data) & ~flag);
> -}
> -
> -
> static void
> vmxnet3_vlan_rx_register(struct net_device *netdev, struct vlan_group
> *grp)
> {
> --- a/drivers/net/vmxnet3/vmxnet3_int.h 2010-10-15 13:58:23.390723065
> -0700
> +++ b/drivers/net/vmxnet3/vmxnet3_int.h 2010-10-15 13:59:46.329296549
> -0700
> @@ -353,9 +353,20 @@ struct vmxnet3_adapter {
> #define VMXNET3_MAX_ETH_HDR_SIZE 22
> #define VMXNET3_MAX_SKB_BUF_SIZE (3*1024)
>
> -void set_flag_le16(__le16 *data, u16 flag);
> -void set_flag_le64(__le64 *data, u64 flag);
> -void reset_flag_le64(__le64 *data, u64 flag);
> +static inline void set_flag_le16(__le16 *data, u16 flag)
> +{
> + *data = cpu_to_le16(le16_to_cpu(*data) | flag);
> +}
> +
> +static inline void set_flag_le64(__le64 *data, u64 flag)
> +{
> + *data = cpu_to_le64(le64_to_cpu(*data) | flag);
> +}
> +
> +static inline void reset_flag_le64(__le64 *data, u64 flag)
> +{
> + *data = cpu_to_le64(le64_to_cpu(*data) & ~flag);
> +}
>
> int
> vmxnet3_quiesce_dev(struct vmxnet3_adapter *adapter);
^ permalink raw reply
* Re: large divisor for flow classifier
From: Jarek Poplawski @ 2010-10-15 21:10 UTC (permalink / raw)
To: Eric Dumazet; +Cc: Jonathan Thibault, Patrick McHardy, netdev
In-Reply-To: <1287172905.2799.8.camel@edumazet-laptop>
Eric Dumazet wrote:
> Le vendredi 15 octobre 2010 à 14:14 -0400, Jonathan Thibault a écrit :
>> It appears that when setting a fairly large divisor on the flow classifier for sfq, traffic stops altogether.
>>
>> On my machine, anything above divisor 2200 seems to stop all traffic. If I want to be fair between hosts (but not flows) for a large network (say 6000 hosts), I run into problems. Obviously the rates here are quite low but this is just an example.
...
> SFQ is limited to a 1024 divisor
>
> You might try following patch :
>
> (8192 is the smallest power of two greater than 6144)
>
> sizeof(struct sfq_sched_data) becomes 0x2ccc instead of 0x10cc
>
> keep in mind hash distribution is not perfect.
>
> What would be the real rate ?
>
>
> diff --git a/net/sched/sch_sfq.c b/net/sched/sch_sfq.c
> index 3cf478d..c4a53d6 100644
> --- a/net/sched/sch_sfq.c
> +++ b/net/sched/sch_sfq.c
> @@ -77,7 +77,7 @@
> It is easy to increase these values, but not in flight. */
>
> #define SFQ_DEPTH 128
> -#define SFQ_HASH_DIVISOR 1024
> +#define SFQ_HASH_DIVISOR 8192
Because of low SFQ_DEPTH, which limits its queue to 127 packets,
SFQ isn't suitable for serving so many users. There is sch_drr as
a replacement, alas more complex and undocumented, but google should
help you enough.
http://git.kernel.org/?p=linux/kernel/git/torvalds/linux-2.6.git;a=commit;h=13d2a1d2b032de08d7dcab6a1edcd47802681f96
Jarek P.
^ permalink raw reply
* [PATCH net-next] pch_gbe: make local functions static
From: Stephen Hemminger @ 2010-10-15 21:09 UTC (permalink / raw)
To: David Miller, Masayuki Ohtake; +Cc: netdev
Make routines that are only used in one file static.
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
---
drivers/net/pch_gbe/pch_gbe.h | 4 +---
drivers/net/pch_gbe/pch_gbe_api.c | 2 +-
drivers/net/pch_gbe/pch_gbe_main.c | 26 +++++++++++++++-----------
3 files changed, 17 insertions(+), 15 deletions(-)
--- a/drivers/net/pch_gbe/pch_gbe.h 2010-10-15 13:56:27.823153599 -0700
+++ b/drivers/net/pch_gbe/pch_gbe.h 2010-10-15 13:56:34.519359889 -0700
@@ -644,9 +644,7 @@ extern void pch_gbe_free_tx_resources(st
extern void pch_gbe_free_rx_resources(struct pch_gbe_adapter *adapter,
struct pch_gbe_rx_ring *rx_ring);
extern void pch_gbe_update_stats(struct pch_gbe_adapter *adapter);
-extern int pch_gbe_mdio_read(struct net_device *netdev, int addr, int reg);
-extern void pch_gbe_mdio_write(struct net_device *netdev, int addr, int reg,
- int data);
+
/* pch_gbe_param.c */
extern void pch_gbe_check_options(struct pch_gbe_adapter *adapter);
--- a/drivers/net/pch_gbe/pch_gbe_api.c 2010-10-15 13:54:46.088037739 -0700
+++ b/drivers/net/pch_gbe/pch_gbe_api.c 2010-10-15 13:54:57.484377021 -0700
@@ -97,7 +97,7 @@ static const struct pch_gbe_functions pc
* pch_gbe_plat_init_function_pointers - Init func ptrs
* @hw: Pointer to the HW structure
*/
-void pch_gbe_plat_init_function_pointers(struct pch_gbe_hw *hw)
+static void pch_gbe_plat_init_function_pointers(struct pch_gbe_hw *hw)
{
/* Set PHY parameter */
hw->phy.reset_delay_us = PCH_GBE_PHY_RESET_DELAY_US;
--- a/drivers/net/pch_gbe/pch_gbe_main.c 2010-10-15 13:54:03.014763090 -0700
+++ b/drivers/net/pch_gbe/pch_gbe_main.c 2010-10-15 13:57:16.992669897 -0700
@@ -85,6 +85,9 @@ const char pch_driver_version[] = DRV_VE
static unsigned int copybreak __read_mostly = PCH_GBE_COPYBREAK_DEFAULT;
+static int pch_gbe_mdio_read(struct net_device *netdev, int addr, int reg);
+static void pch_gbe_mdio_write(struct net_device *netdev, int addr, int reg,
+ int data);
/**
* pch_gbe_mac_read_mac_addr - Read MAC address
* @hw: Pointer to the HW structure
@@ -114,7 +117,7 @@ s32 pch_gbe_mac_read_mac_addr(struct pch
* @reg: Pointer of register
* @busy: Busy bit
*/
-void pch_gbe_wait_clr_bit(void *reg, u32 bit)
+static void pch_gbe_wait_clr_bit(void *reg, u32 bit)
{
u32 tmp;
/* wait busy */
@@ -130,7 +133,7 @@ void pch_gbe_wait_clr_bit(void *reg, u32
* @addr: Pointer to the MAC address
* @index: MAC address array register
*/
-void pch_gbe_mac_mar_set(struct pch_gbe_hw *hw, u8 * addr, u32 index)
+static void pch_gbe_mac_mar_set(struct pch_gbe_hw *hw, u8 * addr, u32 index)
{
u32 mar_low, mar_high, adrmask;
@@ -161,7 +164,7 @@ void pch_gbe_mac_mar_set(struct pch_gbe_
* pch_gbe_mac_reset_hw - Reset hardware
* @hw: Pointer to the HW structure
*/
-void pch_gbe_mac_reset_hw(struct pch_gbe_hw *hw)
+static void pch_gbe_mac_reset_hw(struct pch_gbe_hw *hw)
{
/* Read the MAC address. and store to the private data */
pch_gbe_mac_read_mac_addr(hw);
@@ -180,7 +183,7 @@ void pch_gbe_mac_reset_hw(struct pch_gbe
* @hw: Pointer to the HW structure
* @mar_count: Receive address registers
*/
-void pch_gbe_mac_init_rx_addrs(struct pch_gbe_hw *hw, u16 mar_count)
+static void pch_gbe_mac_init_rx_addrs(struct pch_gbe_hw *hw, u16 mar_count)
{
u32 i;
@@ -206,9 +209,9 @@ void pch_gbe_mac_init_rx_addrs(struct pc
* @mar_used_count: The first MAC Address register free to program
* @mar_total_num: Total number of supported MAC Address Registers
*/
-void pch_gbe_mac_mc_addr_list_update(struct pch_gbe_hw *hw,
- u8 *mc_addr_list, u32 mc_addr_count,
- u32 mar_used_count, u32 mar_total_num)
+static void pch_gbe_mac_mc_addr_list_update(struct pch_gbe_hw *hw,
+ u8 *mc_addr_list, u32 mc_addr_count,
+ u32 mar_used_count, u32 mar_total_num)
{
u32 i, adrmask;
@@ -285,7 +288,7 @@ s32 pch_gbe_mac_force_mac_fc(struct pch_
* @hw: Pointer to the HW structure
* @wu_evt: Wake up event
*/
-void pch_gbe_mac_set_wol_event(struct pch_gbe_hw *hw, u32 wu_evt)
+static void pch_gbe_mac_set_wol_event(struct pch_gbe_hw *hw, u32 wu_evt)
{
u32 addr_mask;
@@ -359,7 +362,7 @@ u16 pch_gbe_mac_ctrl_miim(struct pch_gbe
* pch_gbe_mac_set_pause_packet - Set pause packet
* @hw: Pointer to the HW structure
*/
-void pch_gbe_mac_set_pause_packet(struct pch_gbe_hw *hw)
+static void pch_gbe_mac_set_pause_packet(struct pch_gbe_hw *hw)
{
unsigned long tmp2, tmp3;
@@ -482,7 +485,7 @@ static int pch_gbe_init_phy(struct pch_g
* 0: Successfully
* Negative value: Failed
*/
-int pch_gbe_mdio_read(struct net_device *netdev, int addr, int reg)
+static int pch_gbe_mdio_read(struct net_device *netdev, int addr, int reg)
{
struct pch_gbe_adapter *adapter = netdev_priv(netdev);
struct pch_gbe_hw *hw = &adapter->hw;
@@ -498,7 +501,8 @@ int pch_gbe_mdio_read(struct net_device
* @reg: Access location
* @data: Write data
*/
-void pch_gbe_mdio_write(struct net_device *netdev, int addr, int reg, int data)
+static void pch_gbe_mdio_write(struct net_device *netdev,
+ int addr, int reg, int data)
{
struct pch_gbe_adapter *adapter = netdev_priv(netdev);
struct pch_gbe_hw *hw = &adapter->hw;
^ permalink raw reply
* [PATCH net-next] vmxnet3: make bit twiddle routines inline
From: Stephen Hemminger @ 2010-10-15 21:06 UTC (permalink / raw)
To: Shreyas Bhatewara, David S. Miller; +Cc: VMware, Inc., netdev
Gcc doesn't usually handle inline across compilation units, and the
functions don't have to be global in scope. Move the set/reset flag
functions int the existing vmxnet3 header.
Signed-off-by: Stephen Hemminger <shemminger@vyatta.com>
---
drivers/net/vmxnet3/vmxnet3_drv.c | 17 -----------------
drivers/net/vmxnet3/vmxnet3_int.h | 17 ++++++++++++++---
2 files changed, 14 insertions(+), 20 deletions(-)
--- a/drivers/net/vmxnet3/vmxnet3_drv.c 2010-10-15 13:58:23.378722695 -0700
+++ b/drivers/net/vmxnet3/vmxnet3_drv.c 2010-10-15 13:59:32.724873755 -0700
@@ -1548,23 +1548,6 @@ vmxnet3_free_irqs(struct vmxnet3_adapter
}
}
-
-inline void set_flag_le16(__le16 *data, u16 flag)
-{
- *data = cpu_to_le16(le16_to_cpu(*data) | flag);
-}
-
-inline void set_flag_le64(__le64 *data, u64 flag)
-{
- *data = cpu_to_le64(le64_to_cpu(*data) | flag);
-}
-
-inline void reset_flag_le64(__le64 *data, u64 flag)
-{
- *data = cpu_to_le64(le64_to_cpu(*data) & ~flag);
-}
-
-
static void
vmxnet3_vlan_rx_register(struct net_device *netdev, struct vlan_group *grp)
{
--- a/drivers/net/vmxnet3/vmxnet3_int.h 2010-10-15 13:58:23.390723065 -0700
+++ b/drivers/net/vmxnet3/vmxnet3_int.h 2010-10-15 13:59:46.329296549 -0700
@@ -353,9 +353,20 @@ struct vmxnet3_adapter {
#define VMXNET3_MAX_ETH_HDR_SIZE 22
#define VMXNET3_MAX_SKB_BUF_SIZE (3*1024)
-void set_flag_le16(__le16 *data, u16 flag);
-void set_flag_le64(__le64 *data, u64 flag);
-void reset_flag_le64(__le64 *data, u64 flag);
+static inline void set_flag_le16(__le16 *data, u16 flag)
+{
+ *data = cpu_to_le16(le16_to_cpu(*data) | flag);
+}
+
+static inline void set_flag_le64(__le64 *data, u64 flag)
+{
+ *data = cpu_to_le64(le64_to_cpu(*data) | flag);
+}
+
+static inline void reset_flag_le64(__le64 *data, u64 flag)
+{
+ *data = cpu_to_le64(le64_to_cpu(*data) & ~flag);
+}
int
vmxnet3_quiesce_dev(struct vmxnet3_adapter *adapter);
^ permalink raw reply
page: next (older) | prev (newer) | latest
- recent:[subjects (threaded)|topics (new)|topics (active)]
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox