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
1906bc68
Commit
1906bc68
authored
Apr 06, 2004
by
Christoph Hellwig
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[PATCH] convert acenic to pci_driver API
parent
e578ca5a
Changes
1
Hide whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
250 additions
and
306 deletions
+250
-306
drivers/net/acenic.c
drivers/net/acenic.c
+250
-306
No files found.
drivers/net/acenic.c
View file @
1906bc68
...
...
@@ -420,372 +420,323 @@ static int max_rx_desc[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
};
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
=
"acenic.c: v0.92 08/05/2002 Jes Sorensen, linux-acenic@SunSITE.dk
\n
"
" http://home.cern.ch/~jes/gige/acenic.html
\n
"
;
static
struct
net_device
*
root_dev
;
static
int
probed
__initdata
=
0
;
static
int
__init
acenic_probe
(
void
)
static
int
__devinit
acenic_probe_one
(
struct
pci_dev
*
pdev
,
const
struct
pci_device_id
*
id
)
{
struct
net_device
*
dev
;
struct
ace_private
*
ap
;
struct
pci_dev
*
pdev
=
NULL
;
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
;
}
static
int
boards_found
;
SET_MODULE_OWNER
(
dev
);
SET_NETDEV_DEV
(
dev
,
&
pdev
->
dev
);
dev
=
alloc_etherdev
(
sizeof
(
struct
ace_private
));
if
(
dev
==
NULL
)
{
printk
(
KERN_ERR
"acenic: Unable to allocate "
"net_device structure!
\n
"
);
return
-
ENOMEM
;
}
SET_MODULE_OWNER
(
dev
);
SET_NETDEV_DEV
(
dev
,
&
pdev
->
dev
);
ap
=
dev
->
priv
;
ap
->
pdev
=
pdev
;
ap
=
dev
->
priv
;
ap
->
pdev
=
pdev
;
dev
->
open
=
&
ace_open
;
dev
->
hard_start_xmit
=
&
ace_start_xmit
;
dev
->
features
|=
NETIF_F_SG
|
NETIF_F_IP_CSUM
;
dev
->
features
|=
NETIF_F_SG
|
NETIF_F_IP_CSUM
;
#if ACENIC_DO_VLAN
dev
->
features
|=
NETIF_F_HW_VLAN_TX
|
NETIF_F_HW_VLAN_RX
;
dev
->
vlan_rx_register
=
ace_vlan_rx_register
;
dev
->
vlan_rx_kill_vid
=
ace_vlan_rx_kill_vid
;
dev
->
features
|=
NETIF_F_HW_VLAN_TX
|
NETIF_F_HW_VLAN_RX
;
dev
->
vlan_rx_register
=
ace_vlan_rx_register
;
dev
->
vlan_rx_kill_vid
=
ace_vlan_rx_kill_vid
;
#endif
if
(
1
)
{
static
void
ace_watchdog
(
struct
net_device
*
dev
);
dev
->
tx_timeout
=
&
ace_watchdog
;
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
(
1
)
{
static
void
ace_watchdog
(
struct
net_device
*
dev
);
dev
->
tx_timeout
=
&
ace_watchdog
;
dev
->
watchdog_timeo
=
5
*
HZ
;
}
if
(
pci_enable_device
(
pdev
))
{
free_netdev
(
dev
);
continue
;
}
dev
->
open
=
&
ace_open
;
dev
->
stop
=
&
ace_close
;
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
;
/*
* Enable master mode before we start playing with the
* pci_command word since pci_set_master() will modify
* it.
*/
pci_set_master
(
pdev
);
/* we only display this string ONCE */
if
(
!
boards_found
)
printk
(
version
);
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
))
{
printk
(
KERN_INFO
"%s: Enabling PCI Memory Mapped "
"access - was not enabled by BIOS/Firmware
\n
"
,
dev
->
name
);
ap
->
pci_command
=
ap
->
pci_command
|
PCI_COMMAND_MEMORY
;
pci_write_config_word
(
ap
->
pdev
,
PCI_COMMAND
,
ap
->
pci_command
);
wmb
();
}
/*
* Enable master mode before we start playing with the
* pci_command word since pci_set_master() will modify
* it.
*/
pci_set_master
(
pdev
);
pci_read_config_byte
(
pdev
,
PCI_LATENCY_TIMER
,
&
ap
->
pci_latency
);
if
(
ap
->
pci_latency
<=
0x40
)
{
ap
->
pci_latency
=
0x40
;
pci_write_config_byte
(
pdev
,
PCI_LATENCY_TIMER
,
ap
->
pci_latency
);
}
pci_read_config_word
(
pdev
,
PCI_COMMAND
,
&
ap
->
pci_command
);
/*
* Remap the regs into kernel space - this is abuse of
* dev->base_addr since it was means for I/O port
* addresses but who gives a damn.
*/
dev
->
base_addr
=
pci_resource_start
(
pdev
,
0
);
ap
->
regs
=
(
struct
ace_regs
*
)
ioremap
(
dev
->
base_addr
,
0x4000
);
if
(
!
ap
->
regs
)
{
printk
(
KERN_ERR
"%s: Unable to map I/O register, "
"AceNIC %i will be disabled.
\n
"
,
dev
->
name
,
boards_found
);
break
;
}
/* OpenFirmware on Mac's does not set this - DOH.. */
if
(
!
(
ap
->
pci_command
&
PCI_COMMAND_MEMORY
))
{
printk
(
KERN_INFO
"%s: Enabling PCI Memory Mapped "
"access - was not enabled by BIOS/Firmware
\n
"
,
dev
->
name
);
ap
->
pci_command
=
ap
->
pci_command
|
PCI_COMMAND_MEMORY
;
pci_write_config_word
(
ap
->
pdev
,
PCI_COMMAND
,
ap
->
pci_command
);
wmb
();
}
switch
(
pdev
->
vendor
)
{
case
PCI_VENDOR_ID_ALTEON
:
if
(
pdev
->
device
==
PCI_DEVICE_ID_FARALLON_PN9100T
)
{
strncpy
(
ap
->
name
,
"Farallon PN9100-T "
"Gigabit Ethernet"
,
sizeof
(
ap
->
name
));
printk
(
KERN_INFO
"%s: Farallon PN9100-T "
,
dev
->
name
);
}
else
{
strncpy
(
ap
->
name
,
"AceNIC Gigabit Ethernet"
,
sizeof
(
ap
->
name
));
printk
(
KERN_INFO
"%s: Alteon AceNIC "
,
dev
->
name
);
}
break
;
case
PCI_VENDOR_ID_3COM
:
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
;
}
case
PCI_VENDOR_ID_SGI
:
strncpy
(
ap
->
name
,
"SGI AceNIC Gigabit Ethernet"
,
pci_read_config_byte
(
pdev
,
PCI_LATENCY_TIMER
,
&
ap
->
pci_latency
);
if
(
ap
->
pci_latency
<=
0x40
)
{
ap
->
pci_latency
=
0x40
;
pci_write_config_byte
(
pdev
,
PCI_LATENCY_TIMER
,
ap
->
pci_latency
);
}
/*
* Remap the regs into kernel space - this is abuse of
* dev->base_addr since it was means for I/O port
* addresses but who gives a damn.
*/
dev
->
base_addr
=
pci_resource_start
(
pdev
,
0
);
ap
->
regs
=
(
struct
ace_regs
*
)
ioremap
(
dev
->
base_addr
,
0x4000
);
if
(
!
ap
->
regs
)
{
printk
(
KERN_ERR
"%s: Unable to map I/O register, "
"AceNIC %i will be disabled.
\n
"
,
dev
->
name
,
boards_found
);
goto
fail_free_netdev
;
}
switch
(
pdev
->
vendor
)
{
case
PCI_VENDOR_ID_ALTEON
:
if
(
pdev
->
device
==
PCI_DEVICE_ID_FARALLON_PN9100T
)
{
strncpy
(
ap
->
name
,
"Farallon PN9100-T "
"Gigabit Ethernet"
,
sizeof
(
ap
->
name
));
printk
(
KERN_INFO
"%s: Farallon PN9100-T "
,
dev
->
name
);
}
else
{
strncpy
(
ap
->
name
,
"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
);
printk
(
KERN_INFO
"%s: Alteon AceNIC "
,
dev
->
name
);
}
break
;
case
PCI_VENDOR_ID_3COM
:
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
;
}
ap
->
name
[
sizeof
(
ap
->
name
)
-
1
]
=
'\0'
;
printk
(
"Gigabit Ethernet at 0x%08lx, "
,
dev
->
base_addr
);
case
PCI_VENDOR_ID_SGI
:
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__
printk
(
"irq %s
\n
"
,
__irq_itoa
(
pdev
->
irq
));
printk
(
"irq %s
\n
"
,
__irq_itoa
(
pdev
->
irq
));
#else
printk
(
"irq %i
\n
"
,
pdev
->
irq
);
printk
(
"irq %i
\n
"
,
pdev
->
irq
);
#endif
#ifdef CONFIG_ACENIC_OMIT_TIGON_I
if
((
readl
(
&
ap
->
regs
->
HostCtrl
)
>>
28
)
==
4
)
{
printk
(
KERN_ERR
"%s: Driver compiled without Tigon I"
" support - NIC disabled
\n
"
,
dev
->
name
);
ace_init_cleanup
(
dev
);
free_netdev
(
dev
);
continue
;
}
if
((
readl
(
&
ap
->
regs
->
HostCtrl
)
>>
28
)
==
4
)
{
printk
(
KERN_ERR
"%s: Driver compiled without Tigon I"
" support - NIC disabled
\n
"
,
dev
->
name
);
goto
fail_uninit
;
}
#endif
if
(
ace_allocate_descriptors
(
dev
))
{
/*
* ace_allocate_descriptors() calls
* ace_init_cleanup() on error.
*/
free_netdev
(
dev
);
continue
;
}
if
(
ace_allocate_descriptors
(
dev
))
goto
fail_free_netdev
;
#ifdef MODULE
if
(
boards_found
>=
ACE_MAX_MOD_PARMS
)
ap
->
board_idx
=
BOARD_IDX_OVERFLOW
;
else
ap
->
board_idx
=
boards_found
;
if
(
boards_found
>=
ACE_MAX_MOD_PARMS
)
ap
->
board_idx
=
BOARD_IDX_OVERFLOW
;
else
ap
->
board_idx
=
boards_found
;
#else
ap
->
board_idx
=
BOARD_IDX_STATIC
;
ap
->
board_idx
=
BOARD_IDX_STATIC
;
#endif
if
(
ace_init
(
dev
))
{
/*
* ace_init() calls ace_init_cleanup() on error.
*/
free_netdev
(
dev
);
continue
;
}
if
(
ace_init
(
dev
))
goto
fail_free_netdev
;
if
(
register_netdev
(
dev
))
{
printk
(
KERN_ERR
"acenic: device registration failed
\n
"
);
ace_init_cleanup
(
dev
);
free_netdev
(
dev
);
continue
;
}
if
(
register_netdev
(
dev
))
{
printk
(
KERN_ERR
"acenic: device registration failed
\n
"
);
goto
fail_uninit
;
}
if
(
ap
->
pci_using_dac
)
dev
->
features
|=
NETIF_F_HIGHDMA
;
if
(
ap
->
pci_using_dac
)
dev
->
features
|=
NETIF_F_HIGHDMA
;
boards_found
++
;
}
pci_set_drvdata
(
pdev
,
dev
);
/*
* If we're at this point we're going through ace_probe() for
* the first time. Return success (0) if we've initialized 1
* or more boards. Otherwise, return failure (-ENODEV).
*/
boards_found
++
;
return
0
;
if
(
boards_found
>
0
)
return
0
;
else
return
-
ENODEV
;
fail_uninit:
ace_init_cleanup
(
dev
);
fail_free_netdev:
free_netdev
(
dev
);
return
-
ENODEV
;
}
static
void
__devexit
acenic_remove_one
(
struct
pci_dev
*
pdev
)
{
struct
net_device
*
dev
=
pci_get_drvdata
(
pdev
);
struct
ace_private
*
ap
=
dev
->
priv
;
struct
ace_regs
*
regs
=
ap
->
regs
;
short
i
;
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)"
);
unregister_netdev
(
dev
);
writel
(
readl
(
&
regs
->
CpuCtrl
)
|
CPU_HALT
,
&
regs
->
CpuCtrl
);
if
(
ap
->
version
>=
2
)
writel
(
readl
(
&
regs
->
CpuBCtrl
)
|
CPU_HALT
,
&
regs
->
CpuBCtrl
);
/*
* This clears any pending interrupts
*/
writel
(
1
,
&
regs
->
Mb0Lo
);
readl
(
&
regs
->
CpuCtrl
);
/* flush */
static
void
__exit
ace_module_cleanup
(
void
)
{
struct
ace_private
*
ap
;
struct
ace_regs
*
regs
;
struct
net_device
*
next
;
short
i
;
/*
* Make sure no other CPUs are processing interrupts
* on the card before the buffers are being released.
* Otherwise one might experience some `interesting'
* effects.
*
* Then release the RX buffers - jumbo buffers were
* already released in ace_close().
*/
ace_sync_irq
(
dev
->
irq
);
while
(
root_dev
)
{
ap
=
root_dev
->
priv
;
next
=
ap
->
next
;
unregister_netdev
(
root_dev
);
for
(
i
=
0
;
i
<
RX_STD_RING_ENTRIES
;
i
++
)
{
struct
sk_buff
*
skb
=
ap
->
skb
->
rx_std_skbuff
[
i
].
skb
;
regs
=
ap
->
regs
;
if
(
skb
)
{
struct
ring_info
*
ringp
;
dma_addr_t
mapping
;
writel
(
readl
(
&
regs
->
CpuCtrl
)
|
CPU_HALT
,
&
regs
->
CpuCtrl
);
if
(
ap
->
version
>=
2
)
writel
(
readl
(
&
regs
->
CpuBCtrl
)
|
CPU_HALT
,
&
regs
->
CpuBCtrl
);
/*
* This clears any pending interrupts
*/
writel
(
1
,
&
regs
->
Mb0Lo
);
readl
(
&
regs
->
CpuCtrl
);
/* flush */
ringp
=
&
ap
->
skb
->
rx_std_skbuff
[
i
];
mapping
=
pci_unmap_addr
(
ringp
,
mapping
);
pci_unmap_page
(
ap
->
pdev
,
mapping
,
ACE_STD_BUFSIZE
-
(
2
+
16
),
PCI_DMA_FROMDEVICE
);
/*
* Make sure no other CPUs are processing interrupts
* on the card before the buffers are being released.
* Otherwise one might experience some `interesting'
* effects.
*
* Then release the RX buffers - jumbo buffers were
* already released in ace_close().
*/
ace_sync_irq
(
root_dev
->
irq
);
ap
->
rx_std_ring
[
i
].
size
=
0
;
ap
->
skb
->
rx_std_skbuff
[
i
].
skb
=
NULL
;
dev_kfree_skb
(
skb
);
}
}
for
(
i
=
0
;
i
<
RX_STD_RING_ENTRIES
;
i
++
)
{
struct
sk_buff
*
skb
=
ap
->
skb
->
rx_std_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
)
{
struct
ring_info
*
ringp
;
dma_addr_t
mapping
;
ringp
=
&
ap
->
skb
->
rx_
std
_skbuff
[
i
];
mapping
=
pci_unmap_addr
(
ringp
,
mapping
);
ringp
=
&
ap
->
skb
->
rx_
mini
_skbuff
[
i
];
mapping
=
pci_unmap_addr
(
ringp
,
mapping
);
pci_unmap_page
(
ap
->
pdev
,
mapping
,
ACE_
STD
_BUFSIZE
-
(
2
+
16
),
ACE_
MINI
_BUFSIZE
-
(
2
+
16
),
PCI_DMA_FROMDEVICE
);
ap
->
rx_
std
_ring
[
i
].
size
=
0
;
ap
->
skb
->
rx_
std
_skbuff
[
i
].
skb
=
NULL
;
ap
->
rx_
mini
_ring
[
i
].
size
=
0
;
ap
->
skb
->
rx_
mini
_skbuff
[
i
].
skb
=
NULL
;
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
(
skb
)
{
struct
ring_info
*
ringp
;
dma_addr_t
mapping
;
}
ringp
=
&
ap
->
skb
->
rx_jumbo_skbuff
[
i
];
mapping
=
pci_unmap_addr
(
ringp
,
mapping
)
;
pci_unmap_page
(
ap
->
pdev
,
mapping
,
ACE_JUMBO_BUFSIZE
-
(
2
+
16
),
PCI_DMA_FROMDEVICE
)
;
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
;
ap
->
rx_jumbo_ring
[
i
].
size
=
0
;
ap
->
skb
->
rx_jumbo_skbuff
[
i
].
skb
=
NULL
;
dev_kfree_skb
(
skb
);
}
}
ringp
=
&
ap
->
skb
->
rx_jumbo_skbuff
[
i
]
;
mapping
=
pci_unmap_addr
(
ringp
,
mapping
)
;
pci_unmap_page
(
ap
->
pdev
,
mapping
,
ACE_JUMBO_BUFSIZE
-
(
2
+
16
),
PCI_DMA_FROMDEVICE
);
ace_init_cleanup
(
root_dev
);
free_netdev
(
root_dev
);
root_dev
=
next
;
ap
->
rx_jumbo_ring
[
i
].
size
=
0
;
ap
->
skb
->
rx_jumbo_skbuff
[
i
].
skb
=
NULL
;
dev_kfree_skb
(
skb
);
}
}
ace_init_cleanup
(
dev
);
free_netdev
(
dev
);
}
module_init
(
acenic_probe
);
module_exit
(
ace_module_cleanup
);
static
struct
pci_driver
acenic_pci_driver
=
{
.
name
=
"acenic"
,
.
id_table
=
acenic_pci_tbl
,
.
probe
=
acenic_probe_one
,
.
remove
=
__devexit_p
(
acenic_remove_one
),
};
static
int
__init
acenic_init
(
void
)
{
return
pci_module_init
(
&
acenic_pci_driver
);
}
static
void
__exit
acenic_exit
(
void
)
{
pci_unregister_driver
(
&
acenic_pci_driver
);
}
module_init
(
acenic_init
);
module_exit
(
acenic_exit
);
static
void
ace_free_descriptors
(
struct
net_device
*
dev
)
{
...
...
@@ -1252,13 +1203,6 @@ static int __init ace_init(struct net_device *dev)
}
else
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
spin_lock_init
(
&
ap
->
debug_lock
);
ap
->
last_tx
=
ACE_TX_RING_ENTRIES
(
ap
)
-
1
;
...
...
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