|
@@ -727,7 +727,7 @@ static struct ethtool_ops skge_ethtool_ops = {
|
|
* Allocate ring elements and chain them together
|
|
* Allocate ring elements and chain them together
|
|
* One-to-one association of board descriptors with ring elements
|
|
* One-to-one association of board descriptors with ring elements
|
|
*/
|
|
*/
|
|
-static int skge_ring_alloc(struct skge_ring *ring, void *vaddr, u64 base)
|
|
|
|
|
|
+static int skge_ring_alloc(struct skge_ring *ring, void *vaddr, u32 base)
|
|
{
|
|
{
|
|
struct skge_tx_desc *d;
|
|
struct skge_tx_desc *d;
|
|
struct skge_element *e;
|
|
struct skge_element *e;
|
|
@@ -2168,6 +2168,14 @@ static int skge_up(struct net_device *dev)
|
|
if (!skge->mem)
|
|
if (!skge->mem)
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
|
|
|
|
|
+ BUG_ON(skge->dma & 7);
|
|
|
|
+
|
|
|
|
+ if ((u64)skge->dma >> 32 != ((u64) skge->dma + skge->mem_size) >> 32) {
|
|
|
|
+ printk(KERN_ERR PFX "pci_alloc_consistent region crosses 4G boundary\n");
|
|
|
|
+ err = -EINVAL;
|
|
|
|
+ goto free_pci_mem;
|
|
|
|
+ }
|
|
|
|
+
|
|
memset(skge->mem, 0, skge->mem_size);
|
|
memset(skge->mem, 0, skge->mem_size);
|
|
|
|
|
|
if ((err = skge_ring_alloc(&skge->rx_ring, skge->mem, skge->dma)))
|
|
if ((err = skge_ring_alloc(&skge->rx_ring, skge->mem, skge->dma)))
|