Skip to content

Commit

Permalink
netxen: remove private ioctl
Browse files Browse the repository at this point in the history
The netxen driver includes a private ioctl that provides access
to functionality that is already available in other ways. The PCI
layer has application access hooks (see setpci), and the statistics
are available in ethtool/netstats.

Signed-off-by: Stephen Hemminger <shemminger@osdl.org>
Signed-off-by: Jeff Garzik <jeff@garzik.org>
  • Loading branch information
Stephen Hemminger authored and Jeff Garzik committed Dec 26, 2006
1 parent 3bf8ba3 commit 92104e9
Show file tree
Hide file tree
Showing 6 changed files with 1 addition and 668 deletions.
11 changes: 0 additions & 11 deletions drivers/net/netxen/netxen_nic.h
Original file line number Diff line number Diff line change
Expand Up @@ -1027,14 +1027,6 @@ int netxen_nic_hw_read_wx(struct netxen_adapter *adapter, u64 off, void *data,
int len);
int netxen_nic_hw_write_wx(struct netxen_adapter *adapter, u64 off, void *data,
int len);
int netxen_nic_hw_read_ioctl(struct netxen_adapter *adapter, u64 off,
void *data, int len);
int netxen_nic_hw_write_ioctl(struct netxen_adapter *adapter, u64 off,
void *data, int len);
int netxen_nic_pci_mem_write_ioctl(struct netxen_adapter *adapter,
u64 off, void *data, int size);
int netxen_nic_pci_mem_read_ioctl(struct netxen_adapter *adapter,
u64 off, void *data, int size);
void netxen_crb_writelit_adapter(struct netxen_adapter *adapter,
unsigned long off, int data);

Expand Down Expand Up @@ -1067,9 +1059,6 @@ void netxen_tso_check(struct netxen_adapter *adapter,
struct cmd_desc_type0 *desc, struct sk_buff *skb);
int netxen_nic_hw_resources(struct netxen_adapter *adapter);
void netxen_nic_clear_stats(struct netxen_adapter *adapter);
int
netxen_nic_do_ioctl(struct netxen_adapter *adapter, void *u_data,
struct netxen_port *port);
int netxen_nic_rx_has_work(struct netxen_adapter *adapter);
int netxen_nic_tx_has_work(struct netxen_adapter *adapter);
void netxen_watchdog_task(struct work_struct *work);
Expand Down
5 changes: 1 addition & 4 deletions drivers/net/netxen/netxen_nic_ethtool.c
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,6 @@
#include "netxen_nic_hw.h"
#include "netxen_nic.h"
#include "netxen_nic_phan_reg.h"
#include "netxen_nic_ioctl.h"

struct netxen_nic_stats {
char stat_string[ETH_GSTRING_LEN];
Expand Down Expand Up @@ -79,8 +78,7 @@ static const struct netxen_nic_stats netxen_nic_gstrings_stats[] = {
{"tx_bytes", NETXEN_NIC_STAT(stats.txbytes)},
};

#define NETXEN_NIC_STATS_LEN \
sizeof(netxen_nic_gstrings_stats) / sizeof(struct netxen_nic_stats)
#define NETXEN_NIC_STATS_LEN ARRAY_SIZE(netxen_nic_gstrings_stats)

static const char netxen_nic_gstrings_test[][ETH_GSTRING_LEN] = {
"Register_Test_offline", "EEPROM_Test_offline",
Expand Down Expand Up @@ -711,7 +709,6 @@ netxen_nic_get_ethtool_stats(struct net_device *dev,
(netxen_nic_gstrings_stats[index].sizeof_stat ==
sizeof(u64)) ? *(u64 *) p : *(u32 *) p;
}

}

struct ethtool_ops netxen_nic_ethtool_ops = {
Expand Down
294 changes: 0 additions & 294 deletions drivers/net/netxen/netxen_nic_hw.c
Original file line number Diff line number Diff line change
Expand Up @@ -997,297 +997,3 @@ void netxen_nic_flash_print(struct netxen_adapter *adapter)
fw_major, fw_minor);
}

int netxen_crb_read_val(struct netxen_adapter *adapter, unsigned long off)
{
int data;
netxen_nic_hw_read_wx(adapter, off, &data, 4);
return data;
}

int netxen_nic_hw_write_ioctl(struct netxen_adapter *adapter, u64 off,
void *data, int len)
{
void *addr;
u64 offset = off;
u8 *mem_ptr = NULL;
unsigned long mem_base;
unsigned long mem_page;

if (ADDR_IN_WINDOW1(off)) {
addr = NETXEN_CRB_NORMALIZE(adapter, off);
if (!addr) {
mem_base = pci_resource_start(adapter->ahw.pdev, 0);
offset = NETXEN_CRB_NORMAL(off);
mem_page = offset & PAGE_MASK;
if (mem_page != ((offset + len - 1) & PAGE_MASK))
mem_ptr =
ioremap(mem_base + mem_page, PAGE_SIZE * 2);
else
mem_ptr =
ioremap(mem_base + mem_page, PAGE_SIZE);
if (mem_ptr == 0UL) {
return 1;
}
addr = mem_ptr;
addr += offset & (PAGE_SIZE - 1);
}
} else {
addr = pci_base_offset(adapter, off);
if (!addr) {
mem_base = pci_resource_start(adapter->ahw.pdev, 0);
mem_page = off & PAGE_MASK;
if (mem_page != ((off + len - 1) & PAGE_MASK))
mem_ptr =
ioremap(mem_base + mem_page, PAGE_SIZE * 2);
else
mem_ptr =
ioremap(mem_base + mem_page, PAGE_SIZE);
if (mem_ptr == 0UL) {
return 1;
}
addr = mem_ptr;
addr += off & (PAGE_SIZE - 1);
}
netxen_nic_pci_change_crbwindow(adapter, 0);
}
switch (len) {
case 1:
writeb(*(u8 *) data, addr);
break;
case 2:
writew(*(u16 *) data, addr);
break;
case 4:
writel(*(u32 *) data, addr);
break;
case 8:
writeq(*(u64 *) data, addr);
break;
default:
DPRINTK(INFO,
"writing data %lx to offset %llx, num words=%d\n",
*(unsigned long *)data, off, (len >> 3));

netxen_nic_hw_block_write64((u64 __iomem *) data, addr,
(len >> 3));
break;
}

if (!ADDR_IN_WINDOW1(off))
netxen_nic_pci_change_crbwindow(adapter, 1);
if (mem_ptr)
iounmap(mem_ptr);
return 0;
}

int netxen_nic_hw_read_ioctl(struct netxen_adapter *adapter, u64 off,
void *data, int len)
{
void *addr;
u64 offset;
u8 *mem_ptr = NULL;
unsigned long mem_base;
unsigned long mem_page;

if (ADDR_IN_WINDOW1(off)) {
addr = NETXEN_CRB_NORMALIZE(adapter, off);
if (!addr) {
mem_base = pci_resource_start(adapter->ahw.pdev, 0);
offset = NETXEN_CRB_NORMAL(off);
mem_page = offset & PAGE_MASK;
if (mem_page != ((offset + len - 1) & PAGE_MASK))
mem_ptr =
ioremap(mem_base + mem_page, PAGE_SIZE * 2);
else
mem_ptr =
ioremap(mem_base + mem_page, PAGE_SIZE);
if (mem_ptr == 0UL) {
*(u8 *) data = 0;
return 1;
}
addr = mem_ptr;
addr += offset & (PAGE_SIZE - 1);
}
} else {
addr = pci_base_offset(adapter, off);
if (!addr) {
mem_base = pci_resource_start(adapter->ahw.pdev, 0);
mem_page = off & PAGE_MASK;
if (mem_page != ((off + len - 1) & PAGE_MASK))
mem_ptr =
ioremap(mem_base + mem_page, PAGE_SIZE * 2);
else
mem_ptr =
ioremap(mem_base + mem_page, PAGE_SIZE);
if (mem_ptr == 0UL)
return 1;
addr = mem_ptr;
addr += off & (PAGE_SIZE - 1);
}
netxen_nic_pci_change_crbwindow(adapter, 0);
}
switch (len) {
case 1:
*(u8 *) data = readb(addr);
break;
case 2:
*(u16 *) data = readw(addr);
break;
case 4:
*(u32 *) data = readl(addr);
break;
case 8:
*(u64 *) data = readq(addr);
break;
default:
netxen_nic_hw_block_read64((u64 __iomem *) data, addr,
(len >> 3));
break;
}
if (!ADDR_IN_WINDOW1(off))
netxen_nic_pci_change_crbwindow(adapter, 1);
if (mem_ptr)
iounmap(mem_ptr);
return 0;
}

int netxen_nic_pci_mem_write_ioctl(struct netxen_adapter *adapter, u64 off,
void *data, int size)
{
void *addr;
int ret = 0;
u8 *mem_ptr = NULL;
unsigned long mem_base;
unsigned long mem_page;

if (data == NULL || off > (128 * 1024 * 1024)) {
printk(KERN_ERR "%s: data: %p off:%llx\n",
netxen_nic_driver_name, data, off);
return 1;
}
off = netxen_nic_pci_set_window(adapter, off);
/* Corner case : Malicious user tried to break the driver by reading
last few bytes in ranges and tries to read further addresses.
*/
if (!pci_base(adapter, off + size - 1) && pci_base(adapter, off)) {
printk(KERN_ERR "%s: Invalid access to memory address range"
" 0x%llx - 0x%llx\n", netxen_nic_driver_name, off,
off + size);
return 1;
}
addr = pci_base_offset(adapter, off);
DPRINTK(INFO, "writing data %llx to offset %llx\n",
*(unsigned long long *)data, off);
if (!addr) {
mem_base = pci_resource_start(adapter->ahw.pdev, 0);
mem_page = off & PAGE_MASK;
/* Map two pages whenever user tries to access addresses in two
consecutive pages.
*/
if (mem_page != ((off + size - 1) & PAGE_MASK))
mem_ptr = ioremap(mem_base + mem_page, PAGE_SIZE * 2);
else
mem_ptr = ioremap(mem_base + mem_page, PAGE_SIZE);
if (mem_ptr == 0UL) {
return 1;
}
addr = mem_ptr;
addr += off & (PAGE_SIZE - 1);
}
switch (size) {
case 1:
writeb(*(u8 *) data, addr);
break;
case 2:
writew(*(u16 *) data, addr);
break;
case 4:
writel(*(u32 *) data, addr);
break;
case 8:
writeq(*(u64 *) data, addr);
break;
default:
DPRINTK(INFO,
"writing data %lx to offset %llx, num words=%d\n",
*(unsigned long *)data, off, (size >> 3));

netxen_nic_hw_block_write64((u64 __iomem *) data, addr,
(size >> 3));
break;
}

if (mem_ptr)
iounmap(mem_ptr);
DPRINTK(INFO, "wrote %llx\n", *(unsigned long long *)data);

return ret;
}

int netxen_nic_pci_mem_read_ioctl(struct netxen_adapter *adapter,
u64 off, void *data, int size)
{
void *addr;
int ret = 0;
u8 *mem_ptr = NULL;
unsigned long mem_base;
unsigned long mem_page;

if (data == NULL || off > (128 * 1024 * 1024)) {
printk(KERN_ERR "%s: data: %p off:%llx\n",
netxen_nic_driver_name, data, off);
return 1;
}
off = netxen_nic_pci_set_window(adapter, off);
/* Corner case : Malicious user tried to break the driver by reading
last few bytes in ranges and tries to read further addresses.
*/
if (!pci_base(adapter, off + size - 1) && pci_base(adapter, off)) {
printk(KERN_ERR "%s: Invalid access to memory address range"
" 0x%llx - 0x%llx\n", netxen_nic_driver_name, off,
off + size);
return 1;
}
addr = pci_base_offset(adapter, off);
if (!addr) {
mem_base = pci_resource_start(adapter->ahw.pdev, 0);
mem_page = off & PAGE_MASK;
/* Map two pages whenever user tries to access addresses in two
consecutive pages.
*/
if (mem_page != ((off + size - 1) & PAGE_MASK))
mem_ptr = ioremap(mem_base + mem_page, PAGE_SIZE * 2);
else
mem_ptr = ioremap(mem_base + mem_page, PAGE_SIZE);
if (mem_ptr == 0UL) {
*(u8 *) data = 0;
return 1;
}
addr = mem_ptr;
addr += off & (PAGE_SIZE - 1);
}
switch (size) {
case 1:
*(u8 *) data = readb(addr);
break;
case 2:
*(u16 *) data = readw(addr);
break;
case 4:
*(u32 *) data = readl(addr);
break;
case 8:
*(u64 *) data = readq(addr);
break;
default:
netxen_nic_hw_block_read64((u64 __iomem *) data, addr,
(size >> 3));
break;
}

if (mem_ptr)
iounmap(mem_ptr);
DPRINTK(INFO, "read %llx\n", *(unsigned long long *)data);

return ret;
}
Loading

0 comments on commit 92104e9

Please sign in to comment.