Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
b54885f9
Commit
b54885f9
authored
May 27, 2004
by
Jeff Garzik
Browse files
Options
Browse Files
Download
Plain Diff
Merge redhat.com:/spare/repo/netdev-2.6/acenic
into redhat.com:/spare/repo/net-drivers-2.6
parents
393ce840
1906bc68
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
244 additions
and
521 deletions
+244
-521
drivers/net/acenic.c
drivers/net/acenic.c
+244
-521
No files found.
drivers/net/acenic.c
View file @
b54885f9
...
@@ -131,7 +131,6 @@
...
@@ -131,7 +131,6 @@
#define PCI_DEVICE_ID_SGI_ACENIC 0x0009
#define PCI_DEVICE_ID_SGI_ACENIC 0x0009
#endif
#endif
#if LINUX_VERSION_CODE >= 0x20400
static
struct
pci_device_id
acenic_pci_tbl
[]
=
{
static
struct
pci_device_id
acenic_pci_tbl
[]
=
{
{
PCI_VENDOR_ID_ALTEON
,
PCI_DEVICE_ID_ALTEON_ACENIC_FIBRE
,
{
PCI_VENDOR_ID_ALTEON
,
PCI_DEVICE_ID_ALTEON_ACENIC_FIBRE
,
PCI_ANY_ID
,
PCI_ANY_ID
,
PCI_CLASS_NETWORK_ETHERNET
<<
8
,
0xffff00
,
},
PCI_ANY_ID
,
PCI_ANY_ID
,
PCI_CLASS_NETWORK_ETHERNET
<<
8
,
0xffff00
,
},
...
@@ -156,37 +155,6 @@ static struct pci_device_id acenic_pci_tbl[] = {
...
@@ -156,37 +155,6 @@ static struct pci_device_id acenic_pci_tbl[] = {
{
}
{
}
};
};
MODULE_DEVICE_TABLE
(
pci
,
acenic_pci_tbl
);
MODULE_DEVICE_TABLE
(
pci
,
acenic_pci_tbl
);
#endif
#ifndef MODULE_LICENSE
#define MODULE_LICENSE(a)
#endif
#ifndef wmb
#define wmb() mb()
#endif
#ifndef __exit
#define __exit
#endif
#ifndef __devinit
#define __devinit __init
#endif
#ifndef SMP_CACHE_BYTES
#define SMP_CACHE_BYTES L1_CACHE_BYTES
#endif
#ifndef SET_MODULE_OWNER
#define SET_MODULE_OWNER(dev) do{} while(0)
#define ACE_MOD_INC_USE_COUNT MOD_INC_USE_COUNT
#define ACE_MOD_DEC_USE_COUNT MOD_DEC_USE_COUNT
#else
#define ACE_MOD_INC_USE_COUNT do{} while(0)
#define ACE_MOD_DEC_USE_COUNT do{} while(0)
#endif
#ifndef SET_NETDEV_DEV
#ifndef SET_NETDEV_DEV
#define SET_NETDEV_DEV(net, pdev) do{} while(0)
#define SET_NETDEV_DEV(net, pdev) do{} while(0)
...
@@ -198,151 +166,8 @@ MODULE_DEVICE_TABLE(pci, acenic_pci_tbl);
...
@@ -198,151 +166,8 @@ MODULE_DEVICE_TABLE(pci, acenic_pci_tbl);
#define ace_sync_irq(irq) synchronize_irq()
#define ace_sync_irq(irq) synchronize_irq()
#endif
#endif
#if LINUX_VERSION_CODE < 0x2051e
#ifndef offset_in_page
#define local_irq_save(flags) do{__save_flags(flags) ; \
#define offset_in_page(ptr) ((unsigned long)(ptr) & ~PAGE_MASK)
__cli();} while(0)
#define local_irq_restore(flags) __restore_flags(flags)
#endif
#if (LINUX_VERSION_CODE < 0x02030d)
#define pci_resource_start(dev, bar) dev->base_address[bar]
#elif (LINUX_VERSION_CODE < 0x02032c)
#define pci_resource_start(dev, bar) dev->resource[bar].start
#endif
#if (LINUX_VERSION_CODE < 0x02030e)
#define net_device device
#endif
#if (LINUX_VERSION_CODE < 0x02032a)
typedef
u32
dma_addr_t
;
static
inline
void
*
pci_alloc_consistent
(
struct
pci_dev
*
hwdev
,
size_t
size
,
dma_addr_t
*
dma_handle
)
{
void
*
virt_ptr
;
virt_ptr
=
kmalloc
(
size
,
GFP_KERNEL
);
if
(
!
virt_ptr
)
return
NULL
;
*
dma_handle
=
virt_to_bus
(
virt_ptr
);
return
virt_ptr
;
}
#define pci_free_consistent(cookie, size, ptr, dma_ptr) kfree(ptr)
#define pci_map_page(cookie, page, off, size, dir) \
virt_to_bus(page_address(page)+(off))
#define pci_unmap_page(cookie, address, size, dir)
#define pci_set_dma_mask(dev, mask) \
(((u64)(mask) & 0xffffffff00000000) == 0 ? 0 : -EIO)
#define pci_dma_supported(dev, mask) \
(((u64)(mask) & 0xffffffff00000000) == 0 ? 1 : 0)
#elif (LINUX_VERSION_CODE < 0x02040d)
/*
* 2.4.13 introduced pci_map_page()/pci_unmap_page() - for 2.4.12 and prior,
* fall back on pci_map_single()/pci_unnmap_single().
*
* We are guaranteed that the page is mapped at this point since
* pci_map_page() is only used upon valid struct skb's.
*/
static
inline
dma_addr_t
pci_map_page
(
struct
pci_dev
*
cookie
,
struct
page
*
page
,
unsigned
long
off
,
size_t
size
,
int
dir
)
{
void
*
page_virt
;
page_virt
=
page_address
(
page
);
if
(
!
page_virt
)
BUG
();
return
pci_map_single
(
cookie
,
(
page_virt
+
off
),
size
,
dir
);
}
#define pci_unmap_page(cookie, dma_addr, size, dir) \
pci_unmap_single(cookie, dma_addr, size, dir)
#endif
#if (LINUX_VERSION_CODE < 0x020412)
#define DECLARE_PCI_UNMAP_ADDR(ADDR_NAME)
#define DECLARE_PCI_UNMAP_LEN(LEN_NAME)
#define pci_unmap_addr(PTR, ADDR_NAME) 0
#define pci_unmap_addr_set(PTR, ADDR_NAME, VAL) do{} while(0)
#define pci_unmap_len(PTR, LEN_NAME) 0
#define pci_unmap_len_set(PTR, LEN_NAME, VAL) do{} while(0)
#endif
#if (LINUX_VERSION_CODE < 0x02032b)
/*
* SoftNet
*
* For pre-softnet kernels we need to tell the upper layer not to
* re-enter start_xmit() while we are in there. However softnet
* guarantees not to enter while we are in there so there is no need
* to do the netif_stop_queue() dance unless the transmit queue really
* gets stuck. This should also improve performance according to tests
* done by Aman Singla.
*/
#define dev_kfree_skb_irq(a) dev_kfree_skb(a)
#define netif_wake_queue(dev) clear_bit(0, &dev->tbusy)
#define netif_stop_queue(dev) set_bit(0, &dev->tbusy)
#define late_stop_netif_stop_queue(dev) do{} while(0)
#define early_stop_netif_stop_queue(dev) test_and_set_bit(0,&dev->tbusy)
#define early_stop_netif_wake_queue(dev) netif_wake_queue(dev)
static
inline
void
netif_start_queue
(
struct
net_device
*
dev
)
{
dev
->
tbusy
=
0
;
dev
->
interrupt
=
0
;
dev
->
start
=
1
;
}
#define ace_mark_net_bh() mark_bh(NET_BH)
#define netif_queue_stopped(dev) dev->tbusy
#define netif_running(dev) dev->start
#define ace_if_down(dev) do{dev->start = 0;} while(0)
#define tasklet_struct tq_struct
static
inline
void
tasklet_schedule
(
struct
tasklet_struct
*
tasklet
)
{
queue_task
(
tasklet
,
&
tq_immediate
);
mark_bh
(
IMMEDIATE_BH
);
}
static
inline
void
tasklet_init
(
struct
tasklet_struct
*
tasklet
,
void
(
*
func
)(
unsigned
long
),
unsigned
long
data
)
{
tasklet
->
next
=
NULL
;
tasklet
->
sync
=
0
;
tasklet
->
routine
=
(
void
(
*
)(
void
*
))
func
;
tasklet
->
data
=
(
void
*
)
data
;
}
#define tasklet_kill(tasklet) do{} while(0)
#else
#define late_stop_netif_stop_queue(dev) netif_stop_queue(dev)
#define early_stop_netif_stop_queue(dev) 0
#define early_stop_netif_wake_queue(dev) do{} while(0)
#define ace_mark_net_bh() do{} while(0)
#define ace_if_down(dev) do{} while(0)
#endif
#if (LINUX_VERSION_CODE >= 0x02031b)
#define NEW_NETINIT
#define ACE_PROBE_ARG void
#else
#define ACE_PROBE_ARG struct net_device *dev
#endif
#ifndef min_t
#define min_t(type,a,b) (((a)<(b))?(a):(b))
#endif
#ifndef ARCH_HAS_PREFETCHW
#ifndef prefetchw
#define prefetchw(x) do{} while(0)
#endif
#endif
#endif
#define ACE_MAX_MOD_PARMS 8
#define ACE_MAX_MOD_PARMS 8
...
@@ -595,407 +420,323 @@ static int max_rx_desc[ACE_MAX_MOD_PARMS];
...
@@ -595,407 +420,323 @@ static int max_rx_desc[ACE_MAX_MOD_PARMS];
static
int
tx_ratio
[
ACE_MAX_MOD_PARMS
];
static
int
tx_ratio
[
ACE_MAX_MOD_PARMS
];
static
int
dis_pci_mem_inval
[
ACE_MAX_MOD_PARMS
]
=
{
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
};
static
int
dis_pci_mem_inval
[
ACE_MAX_MOD_PARMS
]
=
{
1
,
1
,
1
,
1
,
1
,
1
,
1
,
1
};
MODULE_AUTHOR
(
"Jes Sorensen <jes@trained-monkey.org>"
);
MODULE_LICENSE
(
"GPL"
);
MODULE_DESCRIPTION
(
"AceNIC/3C985/GA620 Gigabit Ethernet driver"
);
MODULE_PARM
(
link
,
"1-"
__MODULE_STRING
(
8
)
"i"
);
MODULE_PARM
(
trace
,
"1-"
__MODULE_STRING
(
8
)
"i"
);
MODULE_PARM
(
tx_coal_tick
,
"1-"
__MODULE_STRING
(
8
)
"i"
);
MODULE_PARM
(
max_tx_desc
,
"1-"
__MODULE_STRING
(
8
)
"i"
);
MODULE_PARM
(
rx_coal_tick
,
"1-"
__MODULE_STRING
(
8
)
"i"
);
MODULE_PARM
(
max_rx_desc
,
"1-"
__MODULE_STRING
(
8
)
"i"
);
MODULE_PARM
(
tx_ratio
,
"1-"
__MODULE_STRING
(
8
)
"i"
);
MODULE_PARM_DESC
(
link
,
"AceNIC/3C985/NetGear link state"
);
MODULE_PARM_DESC
(
trace
,
"AceNIC/3C985/NetGear firmware trace level"
);
MODULE_PARM_DESC
(
tx_coal_tick
,
"AceNIC/3C985/GA620 max clock ticks to wait from first tx descriptor arrives"
);
MODULE_PARM_DESC
(
max_tx_desc
,
"AceNIC/3C985/GA620 max number of transmit descriptors to wait"
);
MODULE_PARM_DESC
(
rx_coal_tick
,
"AceNIC/3C985/GA620 max clock ticks to wait from first rx descriptor arrives"
);
MODULE_PARM_DESC
(
max_rx_desc
,
"AceNIC/3C985/GA620 max number of receive descriptors to wait"
);
MODULE_PARM_DESC
(
tx_ratio
,
"AceNIC/3C985/GA620 ratio of NIC memory used for TX/RX descriptors (range 0-63)"
);
static
char
version
[]
__initdata
=
static
char
version
[]
__initdata
=
"acenic.c: v0.92 08/05/2002 Jes Sorensen, linux-acenic@SunSITE.dk
\n
"
"acenic.c: v0.92 08/05/2002 Jes Sorensen, linux-acenic@SunSITE.dk
\n
"
" http://home.cern.ch/~jes/gige/acenic.html
\n
"
;
" http://home.cern.ch/~jes/gige/acenic.html
\n
"
;
static
struct
net_device
*
root_dev
;
static
int
__devinit
acenic_probe_one
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
id
)
static
int
probed
__initdata
=
0
;
int
__devinit
acenic_probe
(
ACE_PROBE_ARG
)
{
{
#ifdef NEW_NETINIT
struct
net_device
*
dev
;
struct
net_device
*
dev
;
#endif
struct
ace_private
*
ap
;
struct
ace_private
*
ap
;
struct
pci_dev
*
pdev
=
NULL
;
static
int
boards_found
;
int
boards_found
=
0
;
int
version_disp
;
if
(
probed
)
return
-
ENODEV
;
probed
++
;
version_disp
=
0
;
while
((
pdev
=
pci_find_class
(
PCI_CLASS_NETWORK_ETHERNET
<<
8
,
pdev
)))
{
if
(
!
((
pdev
->
vendor
==
PCI_VENDOR_ID_ALTEON
)
&&
((
pdev
->
device
==
PCI_DEVICE_ID_ALTEON_ACENIC_FIBRE
)
||
(
pdev
->
device
==
PCI_DEVICE_ID_ALTEON_ACENIC_COPPER
)))
&&
!
((
pdev
->
vendor
==
PCI_VENDOR_ID_3COM
)
&&
(
pdev
->
device
==
PCI_DEVICE_ID_3COM_3C985
))
&&
!
((
pdev
->
vendor
==
PCI_VENDOR_ID_NETGEAR
)
&&
((
pdev
->
device
==
PCI_DEVICE_ID_NETGEAR_GA620
)
||
(
pdev
->
device
==
PCI_DEVICE_ID_NETGEAR_GA620T
)))
&&
/*
* Farallon used the DEC vendor ID on their cards by
* mistake for a while
*/
!
((
pdev
->
vendor
==
PCI_VENDOR_ID_DEC
)
&&
(
pdev
->
device
==
PCI_DEVICE_ID_FARALLON_PN9000SX
))
&&
!
((
pdev
->
vendor
==
PCI_VENDOR_ID_ALTEON
)
&&
(
pdev
->
device
==
PCI_DEVICE_ID_FARALLON_PN9100T
))
&&
!
((
pdev
->
vendor
==
PCI_VENDOR_ID_SGI
)
&&
(
pdev
->
device
==
PCI_DEVICE_ID_SGI_ACENIC
)))
continue
;
dev
=
alloc_etherdev
(
sizeof
(
struct
ace_private
));
if
(
dev
==
NULL
)
{
printk
(
KERN_ERR
"acenic: Unable to allocate "
"net_device structure!
\n
"
);
break
;
}
SET_MODULE_OWNER
(
dev
);
dev
=
alloc_etherdev
(
sizeof
(
struct
ace_private
));
SET_NETDEV_DEV
(
dev
,
&
pdev
->
dev
);
if
(
dev
==
NULL
)
{
printk
(
KERN_ERR
"acenic: Unable to allocate "
"net_device structure!
\n
"
);
return
-
ENOMEM
;
}
ap
=
dev
->
priv
;
SET_MODULE_OWNER
(
dev
)
;
ap
->
pdev
=
pdev
;
SET_NETDEV_DEV
(
dev
,
&
pdev
->
dev
)
;
dev
->
open
=
&
ace_open
;
ap
=
dev
->
priv
;
dev
->
hard_start_xmit
=
&
ace_start_xmit
;
ap
->
pdev
=
pdev
;
dev
->
features
|=
NETIF_F_SG
|
NETIF_F_IP_CSUM
;
dev
->
features
|=
NETIF_F_SG
|
NETIF_F_IP_CSUM
;
#if ACENIC_DO_VLAN
#if ACENIC_DO_VLAN
dev
->
features
|=
NETIF_F_HW_VLAN_TX
|
NETIF_F_HW_VLAN_RX
;
dev
->
features
|=
NETIF_F_HW_VLAN_TX
|
NETIF_F_HW_VLAN_RX
;
dev
->
vlan_rx_register
=
ace_vlan_rx_register
;
dev
->
vlan_rx_register
=
ace_vlan_rx_register
;
dev
->
vlan_rx_kill_vid
=
ace_vlan_rx_kill_vid
;
dev
->
vlan_rx_kill_vid
=
ace_vlan_rx_kill_vid
;
#endif
#endif
if
(
1
)
{
if
(
1
)
{
static
void
ace_watchdog
(
struct
net_device
*
dev
);
static
void
ace_watchdog
(
struct
net_device
*
dev
);
dev
->
tx_timeout
=
&
ace_watchdog
;
dev
->
tx_timeout
=
&
ace_watchdog
;
dev
->
watchdog_timeo
=
5
*
HZ
;
dev
->
watchdog_timeo
=
5
*
HZ
;
}
}
dev
->
stop
=
&
ace_close
;
dev
->
get_stats
=
&
ace_get_stats
;
dev
->
set_multicast_list
=
&
ace_set_multicast_list
;
dev
->
do_ioctl
=
&
ace_ioctl
;
dev
->
set_mac_address
=
&
ace_set_mac_addr
;
dev
->
change_mtu
=
&
ace_change_mtu
;
/* display version info if adapter is found */
if
(
!
version_disp
)
{
/* set display flag to TRUE so that */
/* we only display this string ONCE */
version_disp
=
1
;
printk
(
version
);
}
if
(
pci_enable_device
(
pdev
))
{
dev
->
open
=
&
ace_open
;
free_netdev
(
dev
);
dev
->
stop
=
&
ace_close
;
continue
;
dev
->
hard_start_xmit
=
&
ace_start_xmit
;
}
dev
->
get_stats
=
&
ace_get_stats
;
dev
->
set_multicast_list
=
&
ace_set_multicast_list
;
dev
->
do_ioctl
=
&
ace_ioctl
;
dev
->
set_mac_address
=
&
ace_set_mac_addr
;
dev
->
change_mtu
=
&
ace_change_mtu
;
/*
/* we only display this string ONCE */
* Enable master mode before we start playing with the
if
(
!
boards_found
)
* pci_command word since pci_set_master() will modify
printk
(
version
);
* it.
*/
pci_set_master
(
pdev
);
pci_read_config_word
(
pdev
,
PCI_COMMAND
,
&
ap
->
pci_command
);
if
(
pci_enable_device
(
pdev
))
goto
fail_free_netdev
;
/* OpenFirmware on Mac's does not set this - DOH.. */
/*
if
(
!
(
ap
->
pci_command
&
PCI_COMMAND_MEMORY
))
{
* Enable master mode before we start playing with the
printk
(
KERN_INFO
"%s: Enabling PCI Memory Mapped "
* pci_command word since pci_set_master() will modify
"access - was not enabled by BIOS/Firmware
\n
"
,
* it.
dev
->
name
);
*/
ap
->
pci_command
=
ap
->
pci_command
|
PCI_COMMAND_MEMORY
;
pci_set_master
(
pdev
);
pci_write_config_word
(
ap
->
pdev
,
PCI_COMMAND
,
ap
->
pci_command
);
wmb
();
}
pci_read_config_byte
(
pdev
,
PCI_LATENCY_TIMER
,
pci_read_config_word
(
pdev
,
PCI_COMMAND
,
&
ap
->
pci_command
);
&
ap
->
pci_latency
);
if
(
ap
->
pci_latency
<=
0x40
)
{
ap
->
pci_latency
=
0x40
;
pci_write_config_byte
(
pdev
,
PCI_LATENCY_TIMER
,
ap
->
pci_latency
);
}
/*
/* OpenFirmware on Mac's does not set this - DOH.. */
* Remap the regs into kernel space - this is abuse of
if
(
!
(
ap
->
pci_command
&
PCI_COMMAND_MEMORY
))
{
* dev->base_addr since it was means for I/O port
printk
(
KERN_INFO
"%s: Enabling PCI Memory Mapped "
* addresses but who gives a damn.
"access - was not enabled by BIOS/Firmware
\n
"
,
*/
dev
->
name
);
dev
->
base_addr
=
pci_resource_start
(
pdev
,
0
);
ap
->
pci_command
=
ap
->
pci_command
|
PCI_COMMAND_MEMORY
;
ap
->
regs
=
(
struct
ace_regs
*
)
ioremap
(
dev
->
base_addr
,
0x4000
);
pci_write_config_word
(
ap
->
pdev
,
PCI_COMMAND
,
if
(
!
ap
->
regs
)
{
ap
->
pci_command
);
printk
(
KERN_ERR
"%s: Unable to map I/O register, "
wmb
();
"AceNIC %i will be disabled.
\n
"
,
}
dev
->
name
,
boards_found
);
break
;
}
switch
(
pdev
->
vendor
)
{
pci_read_config_byte
(
pdev
,
PCI_LATENCY_TIMER
,
&
ap
->
pci_latency
);
case
PCI_VENDOR_ID_ALTEON
:
if
(
ap
->
pci_latency
<=
0x40
)
{
if
(
pdev
->
device
==
PCI_DEVICE_ID_FARALLON_PN9100T
)
{
ap
->
pci_latency
=
0x40
;
strncpy
(
ap
->
name
,
"Farallon PN9100-T "
pci_write_config_byte
(
pdev
,
PCI_LATENCY_TIMER
,
ap
->
pci_latency
);
"Gigabit Ethernet"
,
sizeof
(
ap
->
name
));
}
printk
(
KERN_INFO
"%s: Farallon PN9100-T "
,
dev
->
name
);
/*
}
else
{
* Remap the regs into kernel space - this is abuse of
strncpy
(
ap
->
name
,
"AceNIC Gigabit Ethernet"
,
* dev->base_addr since it was means for I/O port
sizeof
(
ap
->
name
));
* addresses but who gives a damn.
printk
(
KERN_INFO
"%s: Alteon AceNIC "
,
*/
dev
->
name
);
dev
->
base_addr
=
pci_resource_start
(
pdev
,
0
);
}
ap
->
regs
=
(
struct
ace_regs
*
)
ioremap
(
dev
->
base_addr
,
0x4000
);
break
;
if
(
!
ap
->
regs
)
{
case
PCI_VENDOR_ID_3COM
:
printk
(
KERN_ERR
"%s: Unable to map I/O register, "
strncpy
(
ap
->
name
,
"3Com 3C985 Gigabit Ethernet"
,
"AceNIC %i will be disabled.
\n
"
,
sizeof
(
ap
->
name
));
dev
->
name
,
boards_found
);
printk
(
KERN_INFO
"%s: 3Com 3C985 "
,
dev
->
name
);
goto
fail_free_netdev
;
break
;
}
case
PCI_VENDOR_ID_NETGEAR
:
strncpy
(
ap
->
name
,
"NetGear GA620 Gigabit Ethernet"
,
switch
(
pdev
->
vendor
)
{
sizeof
(
ap
->
name
));
case
PCI_VENDOR_ID_ALTEON
:
printk
(
KERN_INFO
"%s: NetGear GA620 "
,
dev
->
name
);
if
(
pdev
->
device
==
PCI_DEVICE_ID_FARALLON_PN9100T
)
{
break
;
strncpy
(
ap
->
name
,
"Farallon PN9100-T "
case
PCI_VENDOR_ID_DEC
:
"Gigabit Ethernet"
,
sizeof
(
ap
->
name
));
if
(
pdev
->
device
==
PCI_DEVICE_ID_FARALLON_PN9000SX
)
{
printk
(
KERN_INFO
"%s: Farallon PN9100-T "
,
strncpy
(
ap
->
name
,
"Farallon PN9000-SX "
dev
->
name
);
"Gigabit Ethernet"
,
sizeof
(
ap
->
name
));
}
else
{
printk
(
KERN_INFO
"%s: Farallon PN9000-SX "
,
strncpy
(
ap
->
name
,
"AceNIC Gigabit Ethernet"
,
dev
->
name
);
break
;
}
case
PCI_VENDOR_ID_SGI
:
strncpy
(
ap
->
name
,
"SGI AceNIC Gigabit Ethernet"
,
sizeof
(
ap
->
name
));
sizeof
(
ap
->
name
));
printk
(
KERN_INFO
"%s: SGI AceNIC "
,
dev
->
name
);
printk
(
KERN_INFO
"%s: Alteon AceNIC "
,
break
;
dev
->
name
);
default:
}
strncpy
(
ap
->
name
,
"Unknown AceNIC based Gigabit "
break
;
"Ethernet"
,
sizeof
(
ap
->
name
));
case
PCI_VENDOR_ID_3COM
:
printk
(
KERN_INFO
"%s: Unknown AceNIC "
,
dev
->
name
);
strncpy
(
ap
->
name
,
"3Com 3C985 Gigabit Ethernet"
,
sizeof
(
ap
->
name
));
printk
(
KERN_INFO
"%s: 3Com 3C985 "
,
dev
->
name
);
break
;
case
PCI_VENDOR_ID_NETGEAR
:
strncpy
(
ap
->
name
,
"NetGear GA620 Gigabit Ethernet"
,
sizeof
(
ap
->
name
));
printk
(
KERN_INFO
"%s: NetGear GA620 "
,
dev
->
name
);
break
;
case
PCI_VENDOR_ID_DEC
:
if
(
pdev
->
device
==
PCI_DEVICE_ID_FARALLON_PN9000SX
)
{
strncpy
(
ap
->
name
,
"Farallon PN9000-SX "
"Gigabit Ethernet"
,
sizeof
(
ap
->
name
));
printk
(
KERN_INFO
"%s: Farallon PN9000-SX "
,
dev
->
name
);
break
;
break
;
}
}
ap
->
name
[
sizeof
(
ap
->
name
)
-
1
]
=
'\0'
;
case
PCI_VENDOR_ID_SGI
:
printk
(
"Gigabit Ethernet at 0x%08lx, "
,
dev
->
base_addr
);
strncpy
(
ap
->
name
,
"SGI AceNIC Gigabit Ethernet"
,
sizeof
(
ap
->
name
));
printk
(
KERN_INFO
"%s: SGI AceNIC "
,
dev
->
name
);
break
;
default:
strncpy
(
ap
->
name
,
"Unknown AceNIC based Gigabit "
"Ethernet"
,
sizeof
(
ap
->
name
));
printk
(
KERN_INFO
"%s: Unknown AceNIC "
,
dev
->
name
);
break
;
}
ap
->
name
[
sizeof
(
ap
->
name
)
-
1
]
=
'\0'
;
printk
(
"Gigabit Ethernet at 0x%08lx, "
,
dev
->
base_addr
);
#ifdef __sparc__
#ifdef __sparc__
printk
(
"irq %s
\n
"
,
__irq_itoa
(
pdev
->
irq
));
printk
(
"irq %s
\n
"
,
__irq_itoa
(
pdev
->
irq
));
#else
#else
printk
(
"irq %i
\n
"
,
pdev
->
irq
);
printk
(
"irq %i
\n
"
,
pdev
->
irq
);
#endif
#endif
#ifdef CONFIG_ACENIC_OMIT_TIGON_I
#ifdef CONFIG_ACENIC_OMIT_TIGON_I
if
((
readl
(
&
ap
->
regs
->
HostCtrl
)
>>
28
)
==
4
)
{
if
((
readl
(
&
ap
->
regs
->
HostCtrl
)
>>
28
)
==
4
)
{
printk
(
KERN_ERR
"%s: Driver compiled without Tigon I"
printk
(
KERN_ERR
"%s: Driver compiled without Tigon I"
" support - NIC disabled
\n
"
,
dev
->
name
);
" support - NIC disabled
\n
"
,
dev
->
name
);
ace_init_cleanup
(
dev
);
goto
fail_uninit
;
free_netdev
(
dev
);
}
continue
;
}
#endif
#endif
if
(
ace_allocate_descriptors
(
dev
))
{
if
(
ace_allocate_descriptors
(
dev
))
/*
goto
fail_free_netdev
;
* ace_allocate_descriptors() calls
* ace_init_cleanup() on error.
*/
free_netdev
(
dev
);
continue
;
}
#ifdef MODULE
#ifdef MODULE
if
(
boards_found
>=
ACE_MAX_MOD_PARMS
)
if
(
boards_found
>=
ACE_MAX_MOD_PARMS
)
ap
->
board_idx
=
BOARD_IDX_OVERFLOW
;
ap
->
board_idx
=
BOARD_IDX_OVERFLOW
;
else
else
ap
->
board_idx
=
boards_found
;
ap
->
board_idx
=
boards_found
;
#else
#else
ap
->
board_idx
=
BOARD_IDX_STATIC
;
ap
->
board_idx
=
BOARD_IDX_STATIC
;
#endif
#endif
if
(
ace_init
(
dev
))
{
if
(
ace_init
(
dev
))
/*
goto
fail_free_netdev
;
* ace_init() calls ace_init_cleanup() on error.
*/
free_netdev
(
dev
);
continue
;
}
if
(
register_netdev
(
dev
))
{
printk
(
KERN_ERR
"acenic: device registration failed
\n
"
);
ace_init_cleanup
(
dev
);
free_netdev
(
dev
);
continue
;
}
if
(
ap
->
pci_using_dac
)
dev
->
features
|=
NETIF_F_HIGHDMA
;
boards_found
++
;
if
(
register_netdev
(
dev
))
{
printk
(
KERN_ERR
"acenic: device registration failed
\n
"
);
goto
fail_uninit
;
}
}
/*
if
(
ap
->
pci_using_dac
)
* If we're at this point we're going through ace_probe() for
dev
->
features
|=
NETIF_F_HIGHDMA
;
* the first time. Return success (0) if we've initialized 1
* or more boards. Otherwise, return failure (-ENODEV).
*/
if
(
boards_found
>
0
)
return
0
;
else
return
-
ENODEV
;
}
pci_set_drvdata
(
pdev
,
dev
);
#ifdef MODULE
boards_found
++
;
MODULE_AUTHOR
(
"Jes Sorensen <jes@trained-monkey.org>"
);
return
0
;
MODULE_LICENSE
(
"GPL"
);
MODULE_DESCRIPTION
(
"AceNIC/3C985/GA620 Gigabit Ethernet driver"
);
MODULE_PARM
(
link
,
"1-"
__MODULE_STRING
(
8
)
"i"
);
MODULE_PARM
(
trace
,
"1-"
__MODULE_STRING
(
8
)
"i"
);
MODULE_PARM
(
tx_coal_tick
,
"1-"
__MODULE_STRING
(
8
)
"i"
);
MODULE_PARM
(
max_tx_desc
,
"1-"
__MODULE_STRING
(
8
)
"i"
);
MODULE_PARM
(
rx_coal_tick
,
"1-"
__MODULE_STRING
(
8
)
"i"
);
MODULE_PARM
(
max_rx_desc
,
"1-"
__MODULE_STRING
(
8
)
"i"
);
MODULE_PARM
(
tx_ratio
,
"1-"
__MODULE_STRING
(
8
)
"i"
);
MODULE_PARM_DESC
(
link
,
"AceNIC/3C985/NetGear link state"
);
MODULE_PARM_DESC
(
trace
,
"AceNIC/3C985/NetGear firmware trace level"
);
MODULE_PARM_DESC
(
tx_coal_tick
,
"AceNIC/3C985/GA620 max clock ticks to wait from first tx descriptor arrives"
);
MODULE_PARM_DESC
(
max_tx_desc
,
"AceNIC/3C985/GA620 max number of transmit descriptors to wait"
);
MODULE_PARM_DESC
(
rx_coal_tick
,
"AceNIC/3C985/GA620 max clock ticks to wait from first rx descriptor arrives"
);
MODULE_PARM_DESC
(
max_rx_desc
,
"AceNIC/3C985/GA620 max number of receive descriptors to wait"
);
MODULE_PARM_DESC
(
tx_ratio
,
"AceNIC/3C985/GA620 ratio of NIC memory used for TX/RX descriptors (range 0-63)"
);
#endif
fail_uninit:
ace_init_cleanup
(
dev
);
fail_free_netdev:
free_netdev
(
dev
);
return
-
ENODEV
;
}
static
void
__
exit
ace_module_cleanup
(
void
)
static
void
__
devexit
acenic_remove_one
(
struct
pci_dev
*
pdev
)
{
{
struct
ace_private
*
ap
;
struct
net_device
*
dev
=
pci_get_drvdata
(
pdev
)
;
struct
ace_
regs
*
regs
;
struct
ace_
private
*
ap
=
dev
->
priv
;
struct
net_device
*
next
;
struct
ace_regs
*
regs
=
ap
->
regs
;
short
i
;
short
i
;
while
(
root_dev
)
{
unregister_netdev
(
dev
);
ap
=
root_dev
->
priv
;
next
=
ap
->
next
;
unregister_netdev
(
root_dev
);
regs
=
ap
->
regs
;
writel
(
readl
(
&
regs
->
CpuCtrl
)
|
CPU_HALT
,
&
regs
->
CpuCtrl
);
if
(
ap
->
version
>=
2
)
writel
(
readl
(
&
regs
->
CpuCtrl
)
|
CPU_HALT
,
&
regs
->
CpuCtrl
);
writel
(
readl
(
&
regs
->
CpuBCtrl
)
|
CPU_HALT
,
&
regs
->
CpuBCtrl
);
if
(
ap
->
version
>=
2
)
writel
(
readl
(
&
regs
->
CpuBCtrl
)
|
CPU_HALT
,
/*
&
regs
->
CpuBCtrl
);
* This clears any pending interrupts
/*
*/
* This clears any pending interrupts
writel
(
1
,
&
regs
->
Mb0Lo
);
*/
readl
(
&
regs
->
CpuCtrl
);
/* flush */
writel
(
1
,
&
regs
->
Mb0Lo
);
readl
(
&
regs
->
CpuCtrl
);
/* flush */
/*
/*
* Make sure no other CPUs are processing interrupts
* Make sure no other CPUs are processing interrupts
* on the card before the buffers are being released.
* on the card before the buffers are being released.
* Otherwise one might experience some `interesting'
* Otherwise one might experience some `interesting'
* effects.
* effects.
*
*
* Then release the RX buffers - jumbo buffers were
* Then release the RX buffers - jumbo buffers were
* already released in ace_close().
* already released in ace_close().
*/
*/
ace_sync_irq
(
root_
dev
->
irq
);
ace_sync_irq
(
dev
->
irq
);
for
(
i
=
0
;
i
<
RX_STD_RING_ENTRIES
;
i
++
)
{
for
(
i
=
0
;
i
<
RX_STD_RING_ENTRIES
;
i
++
)
{
struct
sk_buff
*
skb
=
ap
->
skb
->
rx_std_skbuff
[
i
].
skb
;
struct
sk_buff
*
skb
=
ap
->
skb
->
rx_std_skbuff
[
i
].
skb
;
if
(
skb
)
{
if
(
skb
)
{
struct
ring_info
*
ringp
;
struct
ring_info
*
ringp
;
dma_addr_t
mapping
;
dma_addr_t
mapping
;
ringp
=
&
ap
->
skb
->
rx_std_skbuff
[
i
];
ringp
=
&
ap
->
skb
->
rx_std_skbuff
[
i
];
mapping
=
pci_unmap_addr
(
ringp
,
mapping
);
mapping
=
pci_unmap_addr
(
ringp
,
mapping
);
pci_unmap_page
(
ap
->
pdev
,
mapping
,
pci_unmap_page
(
ap
->
pdev
,
mapping
,
ACE_STD_BUFSIZE
-
(
2
+
16
),
ACE_STD_BUFSIZE
-
(
2
+
16
),
PCI_DMA_FROMDEVICE
);
PCI_DMA_FROMDEVICE
);
ap
->
rx_std_ring
[
i
].
size
=
0
;
ap
->
rx_std_ring
[
i
].
size
=
0
;
ap
->
skb
->
rx_std_skbuff
[
i
].
skb
=
NULL
;
ap
->
skb
->
rx_std_skbuff
[
i
].
skb
=
NULL
;
dev_kfree_skb
(
skb
);
dev_kfree_skb
(
skb
);
}
}
if
(
ap
->
version
>=
2
)
{
for
(
i
=
0
;
i
<
RX_MINI_RING_ENTRIES
;
i
++
)
{
struct
sk_buff
*
skb
=
ap
->
skb
->
rx_mini_skbuff
[
i
].
skb
;
if
(
skb
)
{
struct
ring_info
*
ringp
;
dma_addr_t
mapping
;
ringp
=
&
ap
->
skb
->
rx_mini_skbuff
[
i
];
mapping
=
pci_unmap_addr
(
ringp
,
mapping
);
pci_unmap_page
(
ap
->
pdev
,
mapping
,
ACE_MINI_BUFSIZE
-
(
2
+
16
),
PCI_DMA_FROMDEVICE
);
ap
->
rx_mini_ring
[
i
].
size
=
0
;
ap
->
skb
->
rx_mini_skbuff
[
i
].
skb
=
NULL
;
dev_kfree_skb
(
skb
);
}
}
}
}
for
(
i
=
0
;
i
<
RX_JUMBO_RING_ENTRIES
;
i
++
)
{
}
struct
sk_buff
*
skb
=
ap
->
skb
->
rx_jumbo_skbuff
[
i
].
skb
;
if
(
ap
->
version
>=
2
)
{
for
(
i
=
0
;
i
<
RX_MINI_RING_ENTRIES
;
i
++
)
{
struct
sk_buff
*
skb
=
ap
->
skb
->
rx_mini_skbuff
[
i
].
skb
;
if
(
skb
)
{
if
(
skb
)
{
struct
ring_info
*
ringp
;
struct
ring_info
*
ringp
;
dma_addr_t
mapping
;
dma_addr_t
mapping
;
ringp
=
&
ap
->
skb
->
rx_
jumbo
_skbuff
[
i
];
ringp
=
&
ap
->
skb
->
rx_
mini
_skbuff
[
i
];
mapping
=
pci_unmap_addr
(
ringp
,
mapping
);
mapping
=
pci_unmap_addr
(
ringp
,
mapping
);
pci_unmap_page
(
ap
->
pdev
,
mapping
,
pci_unmap_page
(
ap
->
pdev
,
mapping
,
ACE_
JUMBO
_BUFSIZE
-
(
2
+
16
),
ACE_
MINI
_BUFSIZE
-
(
2
+
16
),
PCI_DMA_FROMDEVICE
);
PCI_DMA_FROMDEVICE
);
ap
->
rx_
jumbo
_ring
[
i
].
size
=
0
;
ap
->
rx_
mini
_ring
[
i
].
size
=
0
;
ap
->
skb
->
rx_
jumbo
_skbuff
[
i
].
skb
=
NULL
;
ap
->
skb
->
rx_
mini
_skbuff
[
i
].
skb
=
NULL
;
dev_kfree_skb
(
skb
);
dev_kfree_skb
(
skb
);
}
}
}
}
ace_init_cleanup
(
root_dev
);
free_netdev
(
root_dev
);
root_dev
=
next
;
}
}
}
for
(
i
=
0
;
i
<
RX_JUMBO_RING_ENTRIES
;
i
++
)
{
struct
sk_buff
*
skb
=
ap
->
skb
->
rx_jumbo_skbuff
[
i
].
skb
;
if
(
skb
)
{
struct
ring_info
*
ringp
;
dma_addr_t
mapping
;
int
__init
ace_module_init
(
void
)
ringp
=
&
ap
->
skb
->
rx_jumbo_skbuff
[
i
];
{
mapping
=
pci_unmap_addr
(
ringp
,
mapping
);
int
status
;
pci_unmap_page
(
ap
->
pdev
,
mapping
,
ACE_JUMBO_BUFSIZE
-
(
2
+
16
),
PCI_DMA_FROMDEVICE
);
root_dev
=
NULL
;
ap
->
rx_jumbo_ring
[
i
].
size
=
0
;
ap
->
skb
->
rx_jumbo_skbuff
[
i
].
skb
=
NULL
;
dev_kfree_skb
(
skb
);
}
}
#ifdef NEW_NETINIT
ace_init_cleanup
(
dev
);
status
=
acenic_probe
();
free_netdev
(
dev
);
#else
status
=
acenic_probe
(
NULL
);
#endif
return
status
;
}
}
static
struct
pci_driver
acenic_pci_driver
=
{
.
name
=
"acenic"
,
.
id_table
=
acenic_pci_tbl
,
.
probe
=
acenic_probe_one
,
.
remove
=
__devexit_p
(
acenic_remove_one
),
};
#if (LINUX_VERSION_CODE < 0x02032a)
static
int
__init
acenic_init
(
void
)
#ifdef MODULE
int
init_module
(
void
)
{
{
return
ace_module_init
(
);
return
pci_module_init
(
&
acenic_pci_driver
);
}
}
static
void
__exit
acenic_exit
(
void
)
void
cleanup_module
(
void
)
{
{
ace_module_cleanup
(
);
pci_unregister_driver
(
&
acenic_pci_driver
);
}
}
#endif
#else
module_init
(
ace_module_init
);
module_exit
(
ace_module_cleanup
);
#endif
module_init
(
acenic_init
);
module_exit
(
acenic_exit
);
static
void
ace_free_descriptors
(
struct
net_device
*
dev
)
static
void
ace_free_descriptors
(
struct
net_device
*
dev
)
{
{
...
@@ -1462,13 +1203,6 @@ static int __init ace_init(struct net_device *dev)
...
@@ -1462,13 +1203,6 @@ static int __init ace_init(struct net_device *dev)
}
else
}
else
dev
->
irq
=
pdev
->
irq
;
dev
->
irq
=
pdev
->
irq
;
/*
* Register the device here to be able to catch allocated
* interrupt handlers in case the firmware doesn't come up.
*/
ap
->
next
=
root_dev
;
root_dev
=
dev
;
#ifdef INDEX_DEBUG
#ifdef INDEX_DEBUG
spin_lock_init
(
&
ap
->
debug_lock
);
spin_lock_init
(
&
ap
->
debug_lock
);
ap
->
last_tx
=
ACE_TX_RING_ENTRIES
(
ap
)
-
1
;
ap
->
last_tx
=
ACE_TX_RING_ENTRIES
(
ap
)
-
1
;
...
@@ -2642,8 +2376,6 @@ static int ace_open(struct net_device *dev)
...
@@ -2642,8 +2376,6 @@ static int ace_open(struct net_device *dev)
netif_start_queue
(
dev
);
netif_start_queue
(
dev
);
ACE_MOD_INC_USE_COUNT
;
/*
/*
* Setup the bottom half rx ring refill handler
* Setup the bottom half rx ring refill handler
*/
*/
...
@@ -2660,8 +2392,6 @@ static int ace_close(struct net_device *dev)
...
@@ -2660,8 +2392,6 @@ static int ace_close(struct net_device *dev)
unsigned
long
flags
;
unsigned
long
flags
;
short
i
;
short
i
;
ace_if_down
(
dev
);
/*
/*
* Without (or before) releasing irq and stopping hardware, this
* Without (or before) releasing irq and stopping hardware, this
* is an absolute non-sense, by the way. It will be reset instantly
* is an absolute non-sense, by the way. It will be reset instantly
...
@@ -2733,7 +2463,6 @@ static int ace_close(struct net_device *dev)
...
@@ -2733,7 +2463,6 @@ static int ace_close(struct net_device *dev)
ace_unmask_irq
(
dev
);
ace_unmask_irq
(
dev
);
local_irq_restore
(
flags
);
local_irq_restore
(
flags
);
ACE_MOD_DEC_USE_COUNT
;
return
0
;
return
0
;
}
}
...
@@ -2790,12 +2519,6 @@ static int ace_start_xmit(struct sk_buff *skb, struct net_device *dev)
...
@@ -2790,12 +2519,6 @@ static int ace_start_xmit(struct sk_buff *skb, struct net_device *dev)
struct
tx_desc
*
desc
;
struct
tx_desc
*
desc
;
u32
idx
,
flagsize
;
u32
idx
,
flagsize
;
/*
* This only happens with pre-softnet, ie. 2.2.x kernels.
*/
if
(
early_stop_netif_stop_queue
(
dev
))
return
1
;
restart:
restart:
idx
=
ap
->
tx_prd
;
idx
=
ap
->
tx_prd
;
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment