|
@@ -2,14 +2,11 @@
|
|
|
* Copyright (C) Freescale Semicondutor, Inc. 2006. All rights reserved.
|
|
|
*
|
|
|
* Author: Shlomi Gridish <gridish@freescale.com>
|
|
|
+ * Li Yang <leoli@freescale.com>
|
|
|
*
|
|
|
* Description:
|
|
|
* QE UCC Gigabit Ethernet Driver
|
|
|
*
|
|
|
- * Changelog:
|
|
|
- * Jul 6, 2006 Li Yang <LeoLi@freescale.com>
|
|
|
- * - Rearrange code and style fixes
|
|
|
- *
|
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
|
* under the terms of the GNU General Public License as published by the
|
|
|
* Free Software Foundation; either version 2 of the License, or (at your
|
|
@@ -31,9 +28,9 @@
|
|
|
#include <linux/dma-mapping.h>
|
|
|
#include <linux/fsl_devices.h>
|
|
|
#include <linux/ethtool.h>
|
|
|
-#include <linux/platform_device.h>
|
|
|
#include <linux/mii.h>
|
|
|
|
|
|
+#include <asm/of_device.h>
|
|
|
#include <asm/uaccess.h>
|
|
|
#include <asm/irq.h>
|
|
|
#include <asm/io.h>
|
|
@@ -70,7 +67,7 @@
|
|
|
|
|
|
static DEFINE_SPINLOCK(ugeth_lock);
|
|
|
|
|
|
-static ucc_geth_info_t ugeth_primary_info = {
|
|
|
+static struct ucc_geth_info ugeth_primary_info = {
|
|
|
.uf_info = {
|
|
|
.bd_mem_part = MEM_PART_SYSTEM,
|
|
|
.rtsm = UCC_FAST_SEND_IDLES_BETWEEN_FRAMES,
|
|
@@ -163,7 +160,7 @@ static ucc_geth_info_t ugeth_primary_info = {
|
|
|
.riscRx = QE_RISC_ALLOCATION_RISC1_AND_RISC2,
|
|
|
};
|
|
|
|
|
|
-static ucc_geth_info_t ugeth_info[8];
|
|
|
+static struct ucc_geth_info ugeth_info[8];
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
static void mem_disp(u8 *addr, int size)
|
|
@@ -219,8 +216,8 @@ static struct list_head *dequeue(struct list_head *lh)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static int get_interface_details(enet_interface_e enet_interface,
|
|
|
- enet_speed_e *speed,
|
|
|
+static int get_interface_details(enum enet_interface enet_interface,
|
|
|
+ enum enet_speed *speed,
|
|
|
int *r10m,
|
|
|
int *rmm,
|
|
|
int *rpm,
|
|
@@ -283,7 +280,7 @@ static int get_interface_details(enet_interface_e enet_interface,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static struct sk_buff *get_new_skb(ucc_geth_private_t *ugeth, u8 *bd)
|
|
|
+static struct sk_buff *get_new_skb(struct ucc_geth_private *ugeth, u8 *bd)
|
|
|
{
|
|
|
struct sk_buff *skb = NULL;
|
|
|
|
|
@@ -303,21 +300,19 @@ static struct sk_buff *get_new_skb(ucc_geth_private_t *ugeth, u8 *bd)
|
|
|
|
|
|
skb->dev = ugeth->dev;
|
|
|
|
|
|
- BD_BUFFER_SET(bd,
|
|
|
+ out_be32(&((struct qe_bd *)bd)->buf,
|
|
|
dma_map_single(NULL,
|
|
|
skb->data,
|
|
|
ugeth->ug_info->uf_info.max_rx_buf_length +
|
|
|
UCC_GETH_RX_DATA_BUF_ALIGNMENT,
|
|
|
DMA_FROM_DEVICE));
|
|
|
|
|
|
- BD_STATUS_AND_LENGTH_SET(bd,
|
|
|
- (R_E | R_I |
|
|
|
- (BD_STATUS_AND_LENGTH(bd) & R_W)));
|
|
|
+ out_be32((u32 *)bd, (R_E | R_I | (in_be32((u32 *)bd) & R_W)));
|
|
|
|
|
|
return skb;
|
|
|
}
|
|
|
|
|
|
-static int rx_bd_buffer_set(ucc_geth_private_t *ugeth, u8 rxQ)
|
|
|
+static int rx_bd_buffer_set(struct ucc_geth_private *ugeth, u8 rxQ)
|
|
|
{
|
|
|
u8 *bd;
|
|
|
u32 bd_status;
|
|
@@ -328,7 +323,7 @@ static int rx_bd_buffer_set(ucc_geth_private_t *ugeth, u8 rxQ)
|
|
|
i = 0;
|
|
|
|
|
|
do {
|
|
|
- bd_status = BD_STATUS_AND_LENGTH(bd);
|
|
|
+ bd_status = in_be32((u32*)bd);
|
|
|
skb = get_new_skb(ugeth, bd);
|
|
|
|
|
|
if (!skb) /* If can not allocate data buffer,
|
|
@@ -338,19 +333,19 @@ static int rx_bd_buffer_set(ucc_geth_private_t *ugeth, u8 rxQ)
|
|
|
ugeth->rx_skbuff[rxQ][i] = skb;
|
|
|
|
|
|
/* advance the BD pointer */
|
|
|
- bd += UCC_GETH_SIZE_OF_BD;
|
|
|
+ bd += sizeof(struct qe_bd);
|
|
|
i++;
|
|
|
} while (!(bd_status & R_W));
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int fill_init_enet_entries(ucc_geth_private_t *ugeth,
|
|
|
+static int fill_init_enet_entries(struct ucc_geth_private *ugeth,
|
|
|
volatile u32 *p_start,
|
|
|
u8 num_entries,
|
|
|
u32 thread_size,
|
|
|
u32 thread_alignment,
|
|
|
- qe_risc_allocation_e risc,
|
|
|
+ enum qe_risc_allocation risc,
|
|
|
int skip_page_for_first_entry)
|
|
|
{
|
|
|
u32 init_enet_offset;
|
|
@@ -383,10 +378,10 @@ static int fill_init_enet_entries(ucc_geth_private_t *ugeth,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int return_init_enet_entries(ucc_geth_private_t *ugeth,
|
|
|
+static int return_init_enet_entries(struct ucc_geth_private *ugeth,
|
|
|
volatile u32 *p_start,
|
|
|
u8 num_entries,
|
|
|
- qe_risc_allocation_e risc,
|
|
|
+ enum qe_risc_allocation risc,
|
|
|
int skip_page_for_first_entry)
|
|
|
{
|
|
|
u32 init_enet_offset;
|
|
@@ -416,11 +411,11 @@ static int return_init_enet_entries(ucc_geth_private_t *ugeth,
|
|
|
}
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
-static int dump_init_enet_entries(ucc_geth_private_t *ugeth,
|
|
|
+static int dump_init_enet_entries(struct ucc_geth_private *ugeth,
|
|
|
volatile u32 *p_start,
|
|
|
u8 num_entries,
|
|
|
u32 thread_size,
|
|
|
- qe_risc_allocation_e risc,
|
|
|
+ enum qe_risc_allocation risc,
|
|
|
int skip_page_for_first_entry)
|
|
|
{
|
|
|
u32 init_enet_offset;
|
|
@@ -456,14 +451,14 @@ static int dump_init_enet_entries(ucc_geth_private_t *ugeth,
|
|
|
#endif
|
|
|
|
|
|
#ifdef CONFIG_UGETH_FILTERING
|
|
|
-static enet_addr_container_t *get_enet_addr_container(void)
|
|
|
+static struct enet_addr_container *get_enet_addr_container(void)
|
|
|
{
|
|
|
- enet_addr_container_t *enet_addr_cont;
|
|
|
+ struct enet_addr_container *enet_addr_cont;
|
|
|
|
|
|
/* allocate memory */
|
|
|
- enet_addr_cont = kmalloc(sizeof(enet_addr_container_t), GFP_KERNEL);
|
|
|
+ enet_addr_cont = kmalloc(sizeof(struct enet_addr_container), GFP_KERNEL);
|
|
|
if (!enet_addr_cont) {
|
|
|
- ugeth_err("%s: No memory for enet_addr_container_t object.",
|
|
|
+ ugeth_err("%s: No memory for enet_addr_container object.",
|
|
|
__FUNCTION__);
|
|
|
return NULL;
|
|
|
}
|
|
@@ -472,45 +467,43 @@ static enet_addr_container_t *get_enet_addr_container(void)
|
|
|
}
|
|
|
#endif /* CONFIG_UGETH_FILTERING */
|
|
|
|
|
|
-static void put_enet_addr_container(enet_addr_container_t *enet_addr_cont)
|
|
|
+static void put_enet_addr_container(struct enet_addr_container *enet_addr_cont)
|
|
|
{
|
|
|
kfree(enet_addr_cont);
|
|
|
}
|
|
|
|
|
|
+static int set_mac_addr(__be16 __iomem *reg, u8 *mac)
|
|
|
+{
|
|
|
+ out_be16(®[0], ((u16)mac[5] << 8) | mac[4]);
|
|
|
+ out_be16(®[1], ((u16)mac[3] << 8) | mac[2]);
|
|
|
+ out_be16(®[2], ((u16)mac[1] << 8) | mac[0]);
|
|
|
+}
|
|
|
+
|
|
|
#ifdef CONFIG_UGETH_FILTERING
|
|
|
-static int hw_add_addr_in_paddr(ucc_geth_private_t *ugeth,
|
|
|
- enet_addr_t *p_enet_addr, u8 paddr_num)
|
|
|
+static int hw_add_addr_in_paddr(struct ucc_geth_private *ugeth,
|
|
|
+ u8 *p_enet_addr, u8 paddr_num)
|
|
|
{
|
|
|
- ucc_geth_82xx_address_filtering_pram_t *p_82xx_addr_filt;
|
|
|
+ struct ucc_geth_82xx_address_filtering_pram *p_82xx_addr_filt;
|
|
|
|
|
|
if (!(paddr_num < NUM_OF_PADDRS)) {
|
|
|
- ugeth_warn("%s: Illagel paddr_num.", __FUNCTION__);
|
|
|
+ ugeth_warn("%s: Illegal paddr_num.", __FUNCTION__);
|
|
|
return -EINVAL;
|
|
|
}
|
|
|
|
|
|
p_82xx_addr_filt =
|
|
|
- (ucc_geth_82xx_address_filtering_pram_t *) ugeth->p_rx_glbl_pram->
|
|
|
+ (struct ucc_geth_82xx_address_filtering_pram *) ugeth->p_rx_glbl_pram->
|
|
|
addressfiltering;
|
|
|
|
|
|
/* Ethernet frames are defined in Little Endian mode, */
|
|
|
/* therefore to insert the address we reverse the bytes. */
|
|
|
- out_be16(&p_82xx_addr_filt->paddr[paddr_num].h,
|
|
|
- (u16) (((u16) (((u16) ((*p_enet_addr)[5])) << 8)) |
|
|
|
- (u16) (*p_enet_addr)[4]));
|
|
|
- out_be16(&p_82xx_addr_filt->paddr[paddr_num].m,
|
|
|
- (u16) (((u16) (((u16) ((*p_enet_addr)[3])) << 8)) |
|
|
|
- (u16) (*p_enet_addr)[2]));
|
|
|
- out_be16(&p_82xx_addr_filt->paddr[paddr_num].l,
|
|
|
- (u16) (((u16) (((u16) ((*p_enet_addr)[1])) << 8)) |
|
|
|
- (u16) (*p_enet_addr)[0]));
|
|
|
-
|
|
|
+ set_mac_addr(&p_82xx_addr_filt->paddr[paddr_num].h, p_enet_addr);
|
|
|
return 0;
|
|
|
}
|
|
|
#endif /* CONFIG_UGETH_FILTERING */
|
|
|
|
|
|
-static int hw_clear_addr_in_paddr(ucc_geth_private_t *ugeth, u8 paddr_num)
|
|
|
+static int hw_clear_addr_in_paddr(struct ucc_geth_private *ugeth, u8 paddr_num)
|
|
|
{
|
|
|
- ucc_geth_82xx_address_filtering_pram_t *p_82xx_addr_filt;
|
|
|
+ struct ucc_geth_82xx_address_filtering_pram *p_82xx_addr_filt;
|
|
|
|
|
|
if (!(paddr_num < NUM_OF_PADDRS)) {
|
|
|
ugeth_warn("%s: Illagel paddr_num.", __FUNCTION__);
|
|
@@ -518,7 +511,7 @@ static int hw_clear_addr_in_paddr(ucc_geth_private_t *ugeth, u8 paddr_num)
|
|
|
}
|
|
|
|
|
|
p_82xx_addr_filt =
|
|
|
- (ucc_geth_82xx_address_filtering_pram_t *) ugeth->p_rx_glbl_pram->
|
|
|
+ (struct ucc_geth_82xx_address_filtering_pram *) ugeth->p_rx_glbl_pram->
|
|
|
addressfiltering;
|
|
|
|
|
|
/* Writing address ff.ff.ff.ff.ff.ff disables address
|
|
@@ -530,14 +523,14 @@ static int hw_clear_addr_in_paddr(ucc_geth_private_t *ugeth, u8 paddr_num)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void hw_add_addr_in_hash(ucc_geth_private_t *ugeth,
|
|
|
- enet_addr_t *p_enet_addr)
|
|
|
+static void hw_add_addr_in_hash(struct ucc_geth_private *ugeth,
|
|
|
+ u8 *p_enet_addr)
|
|
|
{
|
|
|
- ucc_geth_82xx_address_filtering_pram_t *p_82xx_addr_filt;
|
|
|
+ struct ucc_geth_82xx_address_filtering_pram *p_82xx_addr_filt;
|
|
|
u32 cecr_subblock;
|
|
|
|
|
|
p_82xx_addr_filt =
|
|
|
- (ucc_geth_82xx_address_filtering_pram_t *) ugeth->p_rx_glbl_pram->
|
|
|
+ (struct ucc_geth_82xx_address_filtering_pram *) ugeth->p_rx_glbl_pram->
|
|
|
addressfiltering;
|
|
|
|
|
|
cecr_subblock =
|
|
@@ -546,25 +539,18 @@ static void hw_add_addr_in_hash(ucc_geth_private_t *ugeth,
|
|
|
/* Ethernet frames are defined in Little Endian mode,
|
|
|
therefor to insert */
|
|
|
/* the address to the hash (Big Endian mode), we reverse the bytes.*/
|
|
|
- out_be16(&p_82xx_addr_filt->taddr.h,
|
|
|
- (u16) (((u16) (((u16) ((*p_enet_addr)[5])) << 8)) |
|
|
|
- (u16) (*p_enet_addr)[4]));
|
|
|
- out_be16(&p_82xx_addr_filt->taddr.m,
|
|
|
- (u16) (((u16) (((u16) ((*p_enet_addr)[3])) << 8)) |
|
|
|
- (u16) (*p_enet_addr)[2]));
|
|
|
- out_be16(&p_82xx_addr_filt->taddr.l,
|
|
|
- (u16) (((u16) (((u16) ((*p_enet_addr)[1])) << 8)) |
|
|
|
- (u16) (*p_enet_addr)[0]));
|
|
|
+
|
|
|
+ set_mac_addr(&p_82xx_addr_filt->taddr.h, p_enet_addr);
|
|
|
|
|
|
qe_issue_cmd(QE_SET_GROUP_ADDRESS, cecr_subblock,
|
|
|
- (u8) QE_CR_PROTOCOL_ETHERNET, 0);
|
|
|
+ QE_CR_PROTOCOL_ETHERNET, 0);
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_UGETH_MAGIC_PACKET
|
|
|
-static void magic_packet_detection_enable(ucc_geth_private_t *ugeth)
|
|
|
+static void magic_packet_detection_enable(struct ucc_geth_private *ugeth)
|
|
|
{
|
|
|
- ucc_fast_private_t *uccf;
|
|
|
- ucc_geth_t *ug_regs;
|
|
|
+ struct ucc_fast_private *uccf;
|
|
|
+ struct ucc_geth *ug_regs;
|
|
|
u32 maccfg2, uccm;
|
|
|
|
|
|
uccf = ugeth->uccf;
|
|
@@ -581,10 +567,10 @@ static void magic_packet_detection_enable(ucc_geth_private_t *ugeth)
|
|
|
out_be32(&ug_regs->maccfg2, maccfg2);
|
|
|
}
|
|
|
|
|
|
-static void magic_packet_detection_disable(ucc_geth_private_t *ugeth)
|
|
|
+static void magic_packet_detection_disable(struct ucc_geth_private *ugeth)
|
|
|
{
|
|
|
- ucc_fast_private_t *uccf;
|
|
|
- ucc_geth_t *ug_regs;
|
|
|
+ struct ucc_fast_private *uccf;
|
|
|
+ struct ucc_geth *ug_regs;
|
|
|
u32 maccfg2, uccm;
|
|
|
|
|
|
uccf = ugeth->uccf;
|
|
@@ -602,26 +588,26 @@ static void magic_packet_detection_disable(ucc_geth_private_t *ugeth)
|
|
|
}
|
|
|
#endif /* MAGIC_PACKET */
|
|
|
|
|
|
-static inline int compare_addr(enet_addr_t *addr1, enet_addr_t *addr2)
|
|
|
+static inline int compare_addr(u8 **addr1, u8 **addr2)
|
|
|
{
|
|
|
return memcmp(addr1, addr2, ENET_NUM_OCTETS_PER_ADDRESS);
|
|
|
}
|
|
|
|
|
|
#ifdef DEBUG
|
|
|
-static void get_statistics(ucc_geth_private_t *ugeth,
|
|
|
- ucc_geth_tx_firmware_statistics_t *
|
|
|
+static void get_statistics(struct ucc_geth_private *ugeth,
|
|
|
+ struct ucc_geth_tx_firmware_statistics *
|
|
|
tx_firmware_statistics,
|
|
|
- ucc_geth_rx_firmware_statistics_t *
|
|
|
+ struct ucc_geth_rx_firmware_statistics *
|
|
|
rx_firmware_statistics,
|
|
|
- ucc_geth_hardware_statistics_t *hardware_statistics)
|
|
|
+ struct ucc_geth_hardware_statistics *hardware_statistics)
|
|
|
{
|
|
|
- ucc_fast_t *uf_regs;
|
|
|
- ucc_geth_t *ug_regs;
|
|
|
- ucc_geth_tx_firmware_statistics_pram_t *p_tx_fw_statistics_pram;
|
|
|
- ucc_geth_rx_firmware_statistics_pram_t *p_rx_fw_statistics_pram;
|
|
|
+ struct ucc_fast *uf_regs;
|
|
|
+ struct ucc_geth *ug_regs;
|
|
|
+ struct ucc_geth_tx_firmware_statistics_pram *p_tx_fw_statistics_pram;
|
|
|
+ struct ucc_geth_rx_firmware_statistics_pram *p_rx_fw_statistics_pram;
|
|
|
|
|
|
ug_regs = ugeth->ug_regs;
|
|
|
- uf_regs = (ucc_fast_t *) ug_regs;
|
|
|
+ uf_regs = (struct ucc_fast *) ug_regs;
|
|
|
p_tx_fw_statistics_pram = ugeth->p_tx_fw_statistics_pram;
|
|
|
p_rx_fw_statistics_pram = ugeth->p_rx_fw_statistics_pram;
|
|
|
|
|
@@ -727,7 +713,7 @@ static void get_statistics(ucc_geth_private_t *ugeth,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void dump_bds(ucc_geth_private_t *ugeth)
|
|
|
+static void dump_bds(struct ucc_geth_private *ugeth)
|
|
|
{
|
|
|
int i;
|
|
|
int length;
|
|
@@ -736,7 +722,7 @@ static void dump_bds(ucc_geth_private_t *ugeth)
|
|
|
if (ugeth->p_tx_bd_ring[i]) {
|
|
|
length =
|
|
|
(ugeth->ug_info->bdRingLenTx[i] *
|
|
|
- UCC_GETH_SIZE_OF_BD);
|
|
|
+ sizeof(struct qe_bd));
|
|
|
ugeth_info("TX BDs[%d]", i);
|
|
|
mem_disp(ugeth->p_tx_bd_ring[i], length);
|
|
|
}
|
|
@@ -745,14 +731,14 @@ static void dump_bds(ucc_geth_private_t *ugeth)
|
|
|
if (ugeth->p_rx_bd_ring[i]) {
|
|
|
length =
|
|
|
(ugeth->ug_info->bdRingLenRx[i] *
|
|
|
- UCC_GETH_SIZE_OF_BD);
|
|
|
+ sizeof(struct qe_bd));
|
|
|
ugeth_info("RX BDs[%d]", i);
|
|
|
mem_disp(ugeth->p_rx_bd_ring[i], length);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void dump_regs(ucc_geth_private_t *ugeth)
|
|
|
+static void dump_regs(struct ucc_geth_private *ugeth)
|
|
|
{
|
|
|
int i;
|
|
|
|
|
@@ -893,7 +879,7 @@ static void dump_regs(ucc_geth_private_t *ugeth)
|
|
|
ugeth_info("Base address: 0x%08x",
|
|
|
(u32) & ugeth->p_thread_data_tx[i]);
|
|
|
mem_disp((u8 *) & ugeth->p_thread_data_tx[i],
|
|
|
- sizeof(ucc_geth_thread_data_tx_t));
|
|
|
+ sizeof(struct ucc_geth_thread_data_tx));
|
|
|
}
|
|
|
}
|
|
|
if (ugeth->p_thread_data_rx) {
|
|
@@ -927,7 +913,7 @@ static void dump_regs(ucc_geth_private_t *ugeth)
|
|
|
ugeth_info("Base address: 0x%08x",
|
|
|
(u32) & ugeth->p_thread_data_rx[i]);
|
|
|
mem_disp((u8 *) & ugeth->p_thread_data_rx[i],
|
|
|
- sizeof(ucc_geth_thread_data_rx_t));
|
|
|
+ sizeof(struct ucc_geth_thread_data_rx));
|
|
|
}
|
|
|
}
|
|
|
if (ugeth->p_exf_glbl_param) {
|
|
@@ -1105,7 +1091,7 @@ static void dump_regs(ucc_geth_private_t *ugeth)
|
|
|
ugeth_info("Base address: 0x%08x",
|
|
|
(u32) & ugeth->p_send_q_mem_reg->sqqd[i]);
|
|
|
mem_disp((u8 *) & ugeth->p_send_q_mem_reg->sqqd[i],
|
|
|
- sizeof(ucc_geth_send_queue_qd_t));
|
|
|
+ sizeof(struct ucc_geth_send_queue_qd));
|
|
|
}
|
|
|
}
|
|
|
if (ugeth->p_scheduler) {
|
|
@@ -1187,7 +1173,7 @@ static void dump_regs(ucc_geth_private_t *ugeth)
|
|
|
qe_muram_addr(in_be32
|
|
|
(&ugeth->p_rx_bd_qs_tbl[i].
|
|
|
bdbaseptr)),
|
|
|
- sizeof(ucc_geth_rx_prefetched_bds_t));
|
|
|
+ sizeof(struct ucc_geth_rx_prefetched_bds));
|
|
|
}
|
|
|
}
|
|
|
if (ugeth->p_init_enet_param_shadow) {
|
|
@@ -1198,7 +1184,7 @@ static void dump_regs(ucc_geth_private_t *ugeth)
|
|
|
mem_disp((u8 *) ugeth->p_init_enet_param_shadow,
|
|
|
sizeof(*ugeth->p_init_enet_param_shadow));
|
|
|
|
|
|
- size = sizeof(ucc_geth_thread_rx_pram_t);
|
|
|
+ size = sizeof(struct ucc_geth_thread_rx_pram);
|
|
|
if (ugeth->ug_info->rxExtendedFiltering) {
|
|
|
size +=
|
|
|
THREAD_RX_PRAM_ADDITIONAL_FOR_EXTENDED_FILTERING;
|
|
@@ -1216,7 +1202,7 @@ static void dump_regs(ucc_geth_private_t *ugeth)
|
|
|
&(ugeth->p_init_enet_param_shadow->
|
|
|
txthread[0]),
|
|
|
ENET_INIT_PARAM_MAX_ENTRIES_TX,
|
|
|
- sizeof(ucc_geth_thread_tx_pram_t),
|
|
|
+ sizeof(struct ucc_geth_thread_tx_pram),
|
|
|
ugeth->ug_info->riscTx, 0);
|
|
|
dump_init_enet_entries(ugeth,
|
|
|
&(ugeth->p_init_enet_param_shadow->
|
|
@@ -1578,12 +1564,12 @@ static int init_min_frame_len(u16 min_frame_length,
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int adjust_enet_interface(ucc_geth_private_t *ugeth)
|
|
|
+static int adjust_enet_interface(struct ucc_geth_private *ugeth)
|
|
|
{
|
|
|
- ucc_geth_info_t *ug_info;
|
|
|
- ucc_geth_t *ug_regs;
|
|
|
- ucc_fast_t *uf_regs;
|
|
|
- enet_speed_e speed;
|
|
|
+ struct ucc_geth_info *ug_info;
|
|
|
+ struct ucc_geth *ug_regs;
|
|
|
+ struct ucc_fast *uf_regs;
|
|
|
+ enum enet_speed speed;
|
|
|
int ret_val, rpm = 0, tbi = 0, r10m = 0, rmm =
|
|
|
0, limited_to_full_duplex = 0;
|
|
|
u32 upsmr, maccfg2, utbipar, tbiBaseAddress;
|
|
@@ -1691,8 +1677,8 @@ static int adjust_enet_interface(ucc_geth_private_t *ugeth)
|
|
|
*/
|
|
|
static void adjust_link(struct net_device *dev)
|
|
|
{
|
|
|
- ucc_geth_private_t *ugeth = netdev_priv(dev);
|
|
|
- ucc_geth_t *ug_regs;
|
|
|
+ struct ucc_geth_private *ugeth = netdev_priv(dev);
|
|
|
+ struct ucc_geth *ug_regs;
|
|
|
u32 tempval;
|
|
|
struct ugeth_mii_info *mii_info = ugeth->mii_info;
|
|
|
|
|
@@ -1722,7 +1708,7 @@ static void adjust_link(struct net_device *dev)
|
|
|
if (mii_info->speed != ugeth->oldspeed) {
|
|
|
switch (mii_info->speed) {
|
|
|
case 1000:
|
|
|
-#ifdef CONFIG_MPC836x
|
|
|
+#ifdef CONFIG_PPC_MPC836x
|
|
|
/* FIXME: This code is for 100Mbs BUG fixing,
|
|
|
remove this when it is fixed!!! */
|
|
|
if (ugeth->ug_info->enet_interface ==
|
|
@@ -1768,7 +1754,7 @@ remove this when it is fixed!!! */
|
|
|
break;
|
|
|
case 100:
|
|
|
case 10:
|
|
|
-#ifdef CONFIG_MPC836x
|
|
|
+#ifdef CONFIG_PPC_MPC836x
|
|
|
/* FIXME: This code is for 100Mbs BUG fixing,
|
|
|
remove this lines when it will be fixed!!! */
|
|
|
ugeth->ug_info->enet_interface = ENET_100_RGMII;
|
|
@@ -1827,9 +1813,9 @@ remove this lines when it will be fixed!!! */
|
|
|
*/
|
|
|
static int init_phy(struct net_device *dev)
|
|
|
{
|
|
|
- ucc_geth_private_t *ugeth = netdev_priv(dev);
|
|
|
+ struct ucc_geth_private *ugeth = netdev_priv(dev);
|
|
|
struct phy_info *curphy;
|
|
|
- ucc_mii_mng_t *mii_regs;
|
|
|
+ struct ucc_mii_mng *mii_regs;
|
|
|
struct ugeth_mii_info *mii_info;
|
|
|
int err;
|
|
|
|
|
@@ -1914,17 +1900,17 @@ static int init_phy(struct net_device *dev)
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_UGETH_TX_ON_DEMOND
|
|
|
-static int ugeth_transmit_on_demand(ucc_geth_private_t *ugeth)
|
|
|
+static int ugeth_transmit_on_demand(struct ucc_geth_private *ugeth)
|
|
|
{
|
|
|
- ucc_fast_transmit_on_demand(ugeth->uccf);
|
|
|
+ struct ucc_fastransmit_on_demand(ugeth->uccf);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
-static int ugeth_graceful_stop_tx(ucc_geth_private_t *ugeth)
|
|
|
+static int ugeth_graceful_stop_tx(struct ucc_geth_private *ugeth)
|
|
|
{
|
|
|
- ucc_fast_private_t *uccf;
|
|
|
+ struct ucc_fast_private *uccf;
|
|
|
u32 cecr_subblock;
|
|
|
u32 temp;
|
|
|
|
|
@@ -1940,7 +1926,7 @@ static int ugeth_graceful_stop_tx(ucc_geth_private_t *ugeth)
|
|
|
cecr_subblock =
|
|
|
ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.ucc_num);
|
|
|
qe_issue_cmd(QE_GRACEFUL_STOP_TX, cecr_subblock,
|
|
|
- (u8) QE_CR_PROTOCOL_ETHERNET, 0);
|
|
|
+ QE_CR_PROTOCOL_ETHERNET, 0);
|
|
|
|
|
|
/* Wait for command to complete */
|
|
|
do {
|
|
@@ -1952,9 +1938,9 @@ static int ugeth_graceful_stop_tx(ucc_geth_private_t *ugeth)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int ugeth_graceful_stop_rx(ucc_geth_private_t * ugeth)
|
|
|
+static int ugeth_graceful_stop_rx(struct ucc_geth_private * ugeth)
|
|
|
{
|
|
|
- ucc_fast_private_t *uccf;
|
|
|
+ struct ucc_fast_private *uccf;
|
|
|
u32 cecr_subblock;
|
|
|
u8 temp;
|
|
|
|
|
@@ -1973,7 +1959,7 @@ static int ugeth_graceful_stop_rx(ucc_geth_private_t * ugeth)
|
|
|
ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.
|
|
|
ucc_num);
|
|
|
qe_issue_cmd(QE_GRACEFUL_STOP_RX, cecr_subblock,
|
|
|
- (u8) QE_CR_PROTOCOL_ETHERNET, 0);
|
|
|
+ QE_CR_PROTOCOL_ETHERNET, 0);
|
|
|
|
|
|
temp = ugeth->p_rx_glbl_pram->rxgstpack;
|
|
|
} while (!(temp & GRACEFUL_STOP_ACKNOWLEDGE_RX));
|
|
@@ -1983,41 +1969,40 @@ static int ugeth_graceful_stop_rx(ucc_geth_private_t * ugeth)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int ugeth_restart_tx(ucc_geth_private_t *ugeth)
|
|
|
+static int ugeth_restart_tx(struct ucc_geth_private *ugeth)
|
|
|
{
|
|
|
- ucc_fast_private_t *uccf;
|
|
|
+ struct ucc_fast_private *uccf;
|
|
|
u32 cecr_subblock;
|
|
|
|
|
|
uccf = ugeth->uccf;
|
|
|
|
|
|
cecr_subblock =
|
|
|
ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.ucc_num);
|
|
|
- qe_issue_cmd(QE_RESTART_TX, cecr_subblock, (u8) QE_CR_PROTOCOL_ETHERNET,
|
|
|
- 0);
|
|
|
+ qe_issue_cmd(QE_RESTART_TX, cecr_subblock, QE_CR_PROTOCOL_ETHERNET, 0);
|
|
|
uccf->stopped_tx = 0;
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int ugeth_restart_rx(ucc_geth_private_t *ugeth)
|
|
|
+static int ugeth_restart_rx(struct ucc_geth_private *ugeth)
|
|
|
{
|
|
|
- ucc_fast_private_t *uccf;
|
|
|
+ struct ucc_fast_private *uccf;
|
|
|
u32 cecr_subblock;
|
|
|
|
|
|
uccf = ugeth->uccf;
|
|
|
|
|
|
cecr_subblock =
|
|
|
ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.ucc_num);
|
|
|
- qe_issue_cmd(QE_RESTART_RX, cecr_subblock, (u8) QE_CR_PROTOCOL_ETHERNET,
|
|
|
+ qe_issue_cmd(QE_RESTART_RX, cecr_subblock, QE_CR_PROTOCOL_ETHERNET,
|
|
|
0);
|
|
|
uccf->stopped_rx = 0;
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int ugeth_enable(ucc_geth_private_t *ugeth, comm_dir_e mode)
|
|
|
+static int ugeth_enable(struct ucc_geth_private *ugeth, enum comm_dir mode)
|
|
|
{
|
|
|
- ucc_fast_private_t *uccf;
|
|
|
+ struct ucc_fast_private *uccf;
|
|
|
int enabled_tx, enabled_rx;
|
|
|
|
|
|
uccf = ugeth->uccf;
|
|
@@ -2044,9 +2029,9 @@ static int ugeth_enable(ucc_geth_private_t *ugeth, comm_dir_e mode)
|
|
|
|
|
|
}
|
|
|
|
|
|
-static int ugeth_disable(ucc_geth_private_t * ugeth, comm_dir_e mode)
|
|
|
+static int ugeth_disable(struct ucc_geth_private * ugeth, enum comm_dir mode)
|
|
|
{
|
|
|
- ucc_fast_private_t *uccf;
|
|
|
+ struct ucc_fast_private *uccf;
|
|
|
|
|
|
uccf = ugeth->uccf;
|
|
|
|
|
@@ -2069,7 +2054,7 @@ static int ugeth_disable(ucc_geth_private_t * ugeth, comm_dir_e mode)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static void ugeth_dump_regs(ucc_geth_private_t *ugeth)
|
|
|
+static void ugeth_dump_regs(struct ucc_geth_private *ugeth)
|
|
|
{
|
|
|
#ifdef DEBUG
|
|
|
ucc_fast_dump_regs(ugeth->uccf);
|
|
@@ -2079,9 +2064,9 @@ static void ugeth_dump_regs(ucc_geth_private_t *ugeth)
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_UGETH_FILTERING
|
|
|
-static int ugeth_ext_filtering_serialize_tad(ucc_geth_tad_params_t *
|
|
|
+static int ugeth_ext_filtering_serialize_tad(struct ucc_geth_tad_params *
|
|
|
p_UccGethTadParams,
|
|
|
- qe_fltr_tad_t *qe_fltr_tad)
|
|
|
+ struct qe_fltr_tad *qe_fltr_tad)
|
|
|
{
|
|
|
u16 temp;
|
|
|
|
|
@@ -2119,11 +2104,11 @@ static int ugeth_ext_filtering_serialize_tad(ucc_geth_tad_params_t *
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static enet_addr_container_t
|
|
|
- *ugeth_82xx_filtering_get_match_addr_in_hash(ucc_geth_private_t *ugeth,
|
|
|
- enet_addr_t *p_enet_addr)
|
|
|
+static struct enet_addr_container_t
|
|
|
+ *ugeth_82xx_filtering_get_match_addr_in_hash(struct ucc_geth_private *ugeth,
|
|
|
+ struct enet_addr *p_enet_addr)
|
|
|
{
|
|
|
- enet_addr_container_t *enet_addr_cont;
|
|
|
+ struct enet_addr_container *enet_addr_cont;
|
|
|
struct list_head *p_lh;
|
|
|
u16 i, num;
|
|
|
int32_t j;
|
|
@@ -2144,7 +2129,7 @@ static enet_addr_container_t
|
|
|
|
|
|
for (i = 0; i < num; i++) {
|
|
|
enet_addr_cont =
|
|
|
- (enet_addr_container_t *)
|
|
|
+ (struct enet_addr_container *)
|
|
|
ENET_ADDR_CONT_ENTRY(dequeue(p_lh));
|
|
|
for (j = ENET_NUM_OCTETS_PER_ADDRESS - 1; j >= 0; j--) {
|
|
|
if ((*p_enet_addr)[j] != (enet_addr_cont->address)[j])
|
|
@@ -2157,11 +2142,11 @@ static enet_addr_container_t
|
|
|
return NULL;
|
|
|
}
|
|
|
|
|
|
-static int ugeth_82xx_filtering_add_addr_in_hash(ucc_geth_private_t *ugeth,
|
|
|
- enet_addr_t *p_enet_addr)
|
|
|
+static int ugeth_82xx_filtering_add_addr_in_hash(struct ucc_geth_private *ugeth,
|
|
|
+ struct enet_addr *p_enet_addr)
|
|
|
{
|
|
|
- ucc_geth_enet_address_recognition_location_e location;
|
|
|
- enet_addr_container_t *enet_addr_cont;
|
|
|
+ enum ucc_geth_enet_address_recognition_location location;
|
|
|
+ struct enet_addr_container *enet_addr_cont;
|
|
|
struct list_head *p_lh;
|
|
|
u8 i;
|
|
|
u32 limit;
|
|
@@ -2196,18 +2181,17 @@ static int ugeth_82xx_filtering_add_addr_in_hash(ucc_geth_private_t *ugeth,
|
|
|
enqueue(p_lh, &enet_addr_cont->node); /* Put it back */
|
|
|
++(*p_counter);
|
|
|
|
|
|
- hw_add_addr_in_hash(ugeth, &(enet_addr_cont->address));
|
|
|
-
|
|
|
+ hw_add_addr_in_hash(ugeth, enet_addr_cont->address);
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int ugeth_82xx_filtering_clear_addr_in_hash(ucc_geth_private_t *ugeth,
|
|
|
- enet_addr_t *p_enet_addr)
|
|
|
+static int ugeth_82xx_filtering_clear_addr_in_hash(struct ucc_geth_private *ugeth,
|
|
|
+ struct enet_addr *p_enet_addr)
|
|
|
{
|
|
|
- ucc_geth_82xx_address_filtering_pram_t *p_82xx_addr_filt;
|
|
|
- enet_addr_container_t *enet_addr_cont;
|
|
|
- ucc_fast_private_t *uccf;
|
|
|
- comm_dir_e comm_dir;
|
|
|
+ struct ucc_geth_82xx_address_filtering_pram *p_82xx_addr_filt;
|
|
|
+ struct enet_addr_container *enet_addr_cont;
|
|
|
+ struct ucc_fast_private *uccf;
|
|
|
+ enum comm_dir comm_dir;
|
|
|
u16 i, num;
|
|
|
struct list_head *p_lh;
|
|
|
u32 *addr_h, *addr_l;
|
|
@@ -2216,7 +2200,7 @@ static int ugeth_82xx_filtering_clear_addr_in_hash(ucc_geth_private_t *ugeth,
|
|
|
uccf = ugeth->uccf;
|
|
|
|
|
|
p_82xx_addr_filt =
|
|
|
- (ucc_geth_82xx_address_filtering_pram_t *) ugeth->p_rx_glbl_pram->
|
|
|
+ (struct ucc_geth_82xx_address_filtering_pram *) ugeth->p_rx_glbl_pram->
|
|
|
addressfiltering;
|
|
|
|
|
|
if (!
|
|
@@ -2256,9 +2240,9 @@ static int ugeth_82xx_filtering_clear_addr_in_hash(ucc_geth_private_t *ugeth,
|
|
|
num = --(*p_counter);
|
|
|
for (i = 0; i < num; i++) {
|
|
|
enet_addr_cont =
|
|
|
- (enet_addr_container_t *)
|
|
|
+ (struct enet_addr_container *)
|
|
|
ENET_ADDR_CONT_ENTRY(dequeue(p_lh));
|
|
|
- hw_add_addr_in_hash(ugeth, &(enet_addr_cont->address));
|
|
|
+ hw_add_addr_in_hash(ugeth, enet_addr_cont->address);
|
|
|
enqueue(p_lh, &enet_addr_cont->node); /* Put it back */
|
|
|
}
|
|
|
|
|
@@ -2269,14 +2253,14 @@ static int ugeth_82xx_filtering_clear_addr_in_hash(ucc_geth_private_t *ugeth,
|
|
|
}
|
|
|
#endif /* CONFIG_UGETH_FILTERING */
|
|
|
|
|
|
-static int ugeth_82xx_filtering_clear_all_addr_in_hash(ucc_geth_private_t *
|
|
|
+static int ugeth_82xx_filtering_clear_all_addr_in_hash(struct ucc_geth_private *
|
|
|
ugeth,
|
|
|
- enet_addr_type_e
|
|
|
+ enum enet_addr_type
|
|
|
enet_addr_type)
|
|
|
{
|
|
|
- ucc_geth_82xx_address_filtering_pram_t *p_82xx_addr_filt;
|
|
|
- ucc_fast_private_t *uccf;
|
|
|
- comm_dir_e comm_dir;
|
|
|
+ struct ucc_geth_82xx_address_filtering_pram *p_82xx_addr_filt;
|
|
|
+ struct ucc_fast_private *uccf;
|
|
|
+ enum comm_dir comm_dir;
|
|
|
struct list_head *p_lh;
|
|
|
u16 i, num;
|
|
|
u32 *addr_h, *addr_l;
|
|
@@ -2285,7 +2269,7 @@ static int ugeth_82xx_filtering_clear_all_addr_in_hash(ucc_geth_private_t *
|
|
|
uccf = ugeth->uccf;
|
|
|
|
|
|
p_82xx_addr_filt =
|
|
|
- (ucc_geth_82xx_address_filtering_pram_t *) ugeth->p_rx_glbl_pram->
|
|
|
+ (struct ucc_geth_82xx_address_filtering_pram *) ugeth->p_rx_glbl_pram->
|
|
|
addressfiltering;
|
|
|
|
|
|
if (enet_addr_type == ENET_ADDR_TYPE_GROUP) {
|
|
@@ -2331,8 +2315,8 @@ static int ugeth_82xx_filtering_clear_all_addr_in_hash(ucc_geth_private_t *
|
|
|
}
|
|
|
|
|
|
#ifdef CONFIG_UGETH_FILTERING
|
|
|
-static int ugeth_82xx_filtering_add_addr_in_paddr(ucc_geth_private_t *ugeth,
|
|
|
- enet_addr_t *p_enet_addr,
|
|
|
+static int ugeth_82xx_filtering_add_addr_in_paddr(struct ucc_geth_private *ugeth,
|
|
|
+ struct enet_addr *p_enet_addr,
|
|
|
u8 paddr_num)
|
|
|
{
|
|
|
int i;
|
|
@@ -2352,14 +2336,14 @@ static int ugeth_82xx_filtering_add_addr_in_paddr(ucc_geth_private_t *ugeth,
|
|
|
}
|
|
|
#endif /* CONFIG_UGETH_FILTERING */
|
|
|
|
|
|
-static int ugeth_82xx_filtering_clear_addr_in_paddr(ucc_geth_private_t *ugeth,
|
|
|
+static int ugeth_82xx_filtering_clear_addr_in_paddr(struct ucc_geth_private *ugeth,
|
|
|
u8 paddr_num)
|
|
|
{
|
|
|
ugeth->indAddrRegUsed[paddr_num] = 0; /* mark this paddr as not used */
|
|
|
return hw_clear_addr_in_paddr(ugeth, paddr_num);/* clear in hardware */
|
|
|
}
|
|
|
|
|
|
-static void ucc_geth_memclean(ucc_geth_private_t *ugeth)
|
|
|
+static void ucc_geth_memclean(struct ucc_geth_private *ugeth)
|
|
|
{
|
|
|
u16 i, j;
|
|
|
u8 *bd;
|
|
@@ -2433,8 +2417,8 @@ static void ucc_geth_memclean(ucc_geth_private_t *ugeth)
|
|
|
for (j = 0; j < ugeth->ug_info->bdRingLenTx[i]; j++) {
|
|
|
if (ugeth->tx_skbuff[i][j]) {
|
|
|
dma_unmap_single(NULL,
|
|
|
- BD_BUFFER_ARG(bd),
|
|
|
- (BD_STATUS_AND_LENGTH(bd) &
|
|
|
+ ((qe_bd_t *)bd)->buf,
|
|
|
+ (in_be32((u32 *)bd) &
|
|
|
BD_LENGTH_MASK),
|
|
|
DMA_TO_DEVICE);
|
|
|
dev_kfree_skb_any(ugeth->tx_skbuff[i][j]);
|
|
@@ -2460,18 +2444,17 @@ static void ucc_geth_memclean(ucc_geth_private_t *ugeth)
|
|
|
bd = ugeth->p_rx_bd_ring[i];
|
|
|
for (j = 0; j < ugeth->ug_info->bdRingLenRx[i]; j++) {
|
|
|
if (ugeth->rx_skbuff[i][j]) {
|
|
|
- dma_unmap_single(NULL, BD_BUFFER(bd),
|
|
|
- ugeth->ug_info->
|
|
|
- uf_info.
|
|
|
- max_rx_buf_length +
|
|
|
- UCC_GETH_RX_DATA_BUF_ALIGNMENT,
|
|
|
- DMA_FROM_DEVICE);
|
|
|
-
|
|
|
- dev_kfree_skb_any(ugeth->
|
|
|
- rx_skbuff[i][j]);
|
|
|
+ dma_unmap_single(NULL,
|
|
|
+ ((struct qe_bd *)bd)->buf,
|
|
|
+ ugeth->ug_info->
|
|
|
+ uf_info.max_rx_buf_length +
|
|
|
+ UCC_GETH_RX_DATA_BUF_ALIGNMENT,
|
|
|
+ DMA_FROM_DEVICE);
|
|
|
+ dev_kfree_skb_any(
|
|
|
+ ugeth->rx_skbuff[i][j]);
|
|
|
ugeth->rx_skbuff[i][j] = NULL;
|
|
|
}
|
|
|
- bd += UCC_GETH_SIZE_OF_BD;
|
|
|
+ bd += sizeof(struct qe_bd);
|
|
|
}
|
|
|
|
|
|
kfree(ugeth->rx_skbuff[i]);
|
|
@@ -2496,11 +2479,11 @@ static void ucc_geth_memclean(ucc_geth_private_t *ugeth)
|
|
|
|
|
|
static void ucc_geth_set_multi(struct net_device *dev)
|
|
|
{
|
|
|
- ucc_geth_private_t *ugeth;
|
|
|
+ struct ucc_geth_private *ugeth;
|
|
|
struct dev_mc_list *dmi;
|
|
|
- ucc_fast_t *uf_regs;
|
|
|
- ucc_geth_82xx_address_filtering_pram_t *p_82xx_addr_filt;
|
|
|
- enet_addr_t tempaddr;
|
|
|
+ struct ucc_fast *uf_regs;
|
|
|
+ struct ucc_geth_82xx_address_filtering_pram *p_82xx_addr_filt;
|
|
|
+ u8 tempaddr[6];
|
|
|
u8 *mcptr, *tdptr;
|
|
|
int i, j;
|
|
|
|
|
@@ -2517,7 +2500,7 @@ static void ucc_geth_set_multi(struct net_device *dev)
|
|
|
uf_regs->upsmr &= ~UPSMR_PRO;
|
|
|
|
|
|
p_82xx_addr_filt =
|
|
|
- (ucc_geth_82xx_address_filtering_pram_t *) ugeth->
|
|
|
+ (struct ucc_geth_82xx_address_filtering_pram *) ugeth->
|
|
|
p_rx_glbl_pram->addressfiltering;
|
|
|
|
|
|
if (dev->flags & IFF_ALLMULTI) {
|
|
@@ -2546,23 +2529,22 @@ static void ucc_geth_set_multi(struct net_device *dev)
|
|
|
* copy bytes MSB first from dmi_addr.
|
|
|
*/
|
|
|
mcptr = (u8 *) dmi->dmi_addr + 5;
|
|
|
- tdptr = (u8 *) & tempaddr;
|
|
|
+ tdptr = (u8 *) tempaddr;
|
|
|
for (j = 0; j < 6; j++)
|
|
|
*tdptr++ = *mcptr--;
|
|
|
|
|
|
/* Ask CPM to run CRC and set bit in
|
|
|
* filter mask.
|
|
|
*/
|
|
|
- hw_add_addr_in_hash(ugeth, &tempaddr);
|
|
|
-
|
|
|
+ hw_add_addr_in_hash(ugeth, tempaddr);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
|
|
|
-static void ucc_geth_stop(ucc_geth_private_t *ugeth)
|
|
|
+static void ucc_geth_stop(struct ucc_geth_private *ugeth)
|
|
|
{
|
|
|
- ucc_geth_t *ug_regs = ugeth->ug_regs;
|
|
|
+ struct ucc_geth *ug_regs = ugeth->ug_regs;
|
|
|
u32 tempval;
|
|
|
|
|
|
ugeth_vdbg("%s: IN", __FUNCTION__);
|
|
@@ -2605,15 +2587,15 @@ static void ucc_geth_stop(ucc_geth_private_t *ugeth)
|
|
|
ucc_geth_memclean(ugeth);
|
|
|
}
|
|
|
|
|
|
-static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
+static int ucc_geth_startup(struct ucc_geth_private *ugeth)
|
|
|
{
|
|
|
- ucc_geth_82xx_address_filtering_pram_t *p_82xx_addr_filt;
|
|
|
- ucc_geth_init_pram_t *p_init_enet_pram;
|
|
|
- ucc_fast_private_t *uccf;
|
|
|
- ucc_geth_info_t *ug_info;
|
|
|
- ucc_fast_info_t *uf_info;
|
|
|
- ucc_fast_t *uf_regs;
|
|
|
- ucc_geth_t *ug_regs;
|
|
|
+ struct ucc_geth_82xx_address_filtering_pram *p_82xx_addr_filt;
|
|
|
+ struct ucc_geth_init_pram *p_init_enet_pram;
|
|
|
+ struct ucc_fast_private *uccf;
|
|
|
+ struct ucc_geth_info *ug_info;
|
|
|
+ struct ucc_fast_info *uf_info;
|
|
|
+ struct ucc_fast *uf_regs;
|
|
|
+ struct ucc_geth *ug_regs;
|
|
|
int ret_val = -EINVAL;
|
|
|
u32 remoder = UCC_GETH_REMODER_INIT;
|
|
|
u32 init_enet_pram_offset, cecr_subblock, command, maccfg1;
|
|
@@ -2788,7 +2770,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
UCC_GETH_VLAN_OPERATION_NON_TAGGED_NOP);
|
|
|
|
|
|
uf_regs = uccf->uf_regs;
|
|
|
- ug_regs = (ucc_geth_t *) (uccf->uf_regs);
|
|
|
+ ug_regs = (struct ucc_geth *) (uccf->uf_regs);
|
|
|
ugeth->ug_regs = ug_regs;
|
|
|
|
|
|
init_default_reg_vals(&uf_regs->upsmr,
|
|
@@ -2869,10 +2851,10 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
/* Allocate in multiple of
|
|
|
UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT,
|
|
|
according to spec */
|
|
|
- length = ((ug_info->bdRingLenTx[j] * UCC_GETH_SIZE_OF_BD)
|
|
|
+ length = ((ug_info->bdRingLenTx[j] * sizeof(struct qe_bd))
|
|
|
/ UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT)
|
|
|
* UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT;
|
|
|
- if ((ug_info->bdRingLenTx[j] * UCC_GETH_SIZE_OF_BD) %
|
|
|
+ if ((ug_info->bdRingLenTx[j] * sizeof(struct qe_bd)) %
|
|
|
UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT)
|
|
|
length += UCC_GETH_TX_BD_RING_SIZE_MEMORY_ALIGNMENT;
|
|
|
if (uf_info->bd_mem_part == MEM_PART_SYSTEM) {
|
|
@@ -2904,13 +2886,13 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
}
|
|
|
/* Zero unused end of bd ring, according to spec */
|
|
|
memset(ugeth->p_tx_bd_ring[j] +
|
|
|
- ug_info->bdRingLenTx[j] * UCC_GETH_SIZE_OF_BD, 0,
|
|
|
- length - ug_info->bdRingLenTx[j] * UCC_GETH_SIZE_OF_BD);
|
|
|
+ ug_info->bdRingLenTx[j] * sizeof(struct qe_bd), 0,
|
|
|
+ length - ug_info->bdRingLenTx[j] * sizeof(struct qe_bd));
|
|
|
}
|
|
|
|
|
|
/* Allocate Rx bds */
|
|
|
for (j = 0; j < ug_info->numQueuesRx; j++) {
|
|
|
- length = ug_info->bdRingLenRx[j] * UCC_GETH_SIZE_OF_BD;
|
|
|
+ length = ug_info->bdRingLenRx[j] * sizeof(struct qe_bd);
|
|
|
if (uf_info->bd_mem_part == MEM_PART_SYSTEM) {
|
|
|
u32 align = 4;
|
|
|
if (UCC_GETH_RX_BD_RING_ALIGNMENT > 4)
|
|
@@ -2960,12 +2942,15 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
ugeth->skb_curtx[j] = ugeth->skb_dirtytx[j] = 0;
|
|
|
bd = ugeth->confBd[j] = ugeth->txBd[j] = ugeth->p_tx_bd_ring[j];
|
|
|
for (i = 0; i < ug_info->bdRingLenTx[j]; i++) {
|
|
|
- BD_BUFFER_CLEAR(bd);
|
|
|
- BD_STATUS_AND_LENGTH_SET(bd, 0);
|
|
|
- bd += UCC_GETH_SIZE_OF_BD;
|
|
|
+ /* clear bd buffer */
|
|
|
+ out_be32(&((struct qe_bd *)bd)->buf, 0);
|
|
|
+ /* set bd status and length */
|
|
|
+ out_be32((u32 *)bd, 0);
|
|
|
+ bd += sizeof(struct qe_bd);
|
|
|
}
|
|
|
- bd -= UCC_GETH_SIZE_OF_BD;
|
|
|
- BD_STATUS_AND_LENGTH_SET(bd, T_W);/* for last BD set Wrap bit */
|
|
|
+ bd -= sizeof(struct qe_bd);
|
|
|
+ /* set bd status and length */
|
|
|
+ out_be32((u32 *)bd, T_W); /* for last BD set Wrap bit */
|
|
|
}
|
|
|
|
|
|
/* Init Rx bds */
|
|
@@ -2989,12 +2974,15 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
ugeth->skb_currx[j] = 0;
|
|
|
bd = ugeth->rxBd[j] = ugeth->p_rx_bd_ring[j];
|
|
|
for (i = 0; i < ug_info->bdRingLenRx[j]; i++) {
|
|
|
- BD_STATUS_AND_LENGTH_SET(bd, R_I);
|
|
|
- BD_BUFFER_CLEAR(bd);
|
|
|
- bd += UCC_GETH_SIZE_OF_BD;
|
|
|
+ /* set bd status and length */
|
|
|
+ out_be32((u32 *)bd, R_I);
|
|
|
+ /* clear bd buffer */
|
|
|
+ out_be32(&((struct qe_bd *)bd)->buf, 0);
|
|
|
+ bd += sizeof(struct qe_bd);
|
|
|
}
|
|
|
- bd -= UCC_GETH_SIZE_OF_BD;
|
|
|
- BD_STATUS_AND_LENGTH_SET(bd, R_W);/* for last BD set Wrap bit */
|
|
|
+ bd -= sizeof(struct qe_bd);
|
|
|
+ /* set bd status and length */
|
|
|
+ out_be32((u32 *)bd, R_W); /* for last BD set Wrap bit */
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -3003,7 +2991,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
/* Tx global PRAM */
|
|
|
/* Allocate global tx parameter RAM page */
|
|
|
ugeth->tx_glbl_pram_offset =
|
|
|
- qe_muram_alloc(sizeof(ucc_geth_tx_global_pram_t),
|
|
|
+ qe_muram_alloc(sizeof(struct ucc_geth_tx_global_pram),
|
|
|
UCC_GETH_TX_GLOBAL_PRAM_ALIGNMENT);
|
|
|
if (IS_MURAM_ERR(ugeth->tx_glbl_pram_offset)) {
|
|
|
ugeth_err
|
|
@@ -3013,10 +3001,10 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
ugeth->p_tx_glbl_pram =
|
|
|
- (ucc_geth_tx_global_pram_t *) qe_muram_addr(ugeth->
|
|
|
+ (struct ucc_geth_tx_global_pram *) qe_muram_addr(ugeth->
|
|
|
tx_glbl_pram_offset);
|
|
|
/* Zero out p_tx_glbl_pram */
|
|
|
- memset(ugeth->p_tx_glbl_pram, 0, sizeof(ucc_geth_tx_global_pram_t));
|
|
|
+ memset(ugeth->p_tx_glbl_pram, 0, sizeof(struct ucc_geth_tx_global_pram));
|
|
|
|
|
|
/* Fill global PRAM */
|
|
|
|
|
@@ -3024,7 +3012,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
/* Size varies with number of Tx threads */
|
|
|
ugeth->thread_dat_tx_offset =
|
|
|
qe_muram_alloc(numThreadsTxNumerical *
|
|
|
- sizeof(ucc_geth_thread_data_tx_t) +
|
|
|
+ sizeof(struct ucc_geth_thread_data_tx) +
|
|
|
32 * (numThreadsTxNumerical == 1),
|
|
|
UCC_GETH_THREAD_DATA_ALIGNMENT);
|
|
|
if (IS_MURAM_ERR(ugeth->thread_dat_tx_offset)) {
|
|
@@ -3036,7 +3024,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
}
|
|
|
|
|
|
ugeth->p_thread_data_tx =
|
|
|
- (ucc_geth_thread_data_tx_t *) qe_muram_addr(ugeth->
|
|
|
+ (struct ucc_geth_thread_data_tx *) qe_muram_addr(ugeth->
|
|
|
thread_dat_tx_offset);
|
|
|
out_be32(&ugeth->p_tx_glbl_pram->tqptr, ugeth->thread_dat_tx_offset);
|
|
|
|
|
@@ -3053,7 +3041,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
/* Size varies with number of Tx queues */
|
|
|
ugeth->send_q_mem_reg_offset =
|
|
|
qe_muram_alloc(ug_info->numQueuesTx *
|
|
|
- sizeof(ucc_geth_send_queue_qd_t),
|
|
|
+ sizeof(struct ucc_geth_send_queue_qd),
|
|
|
UCC_GETH_SEND_QUEUE_QUEUE_DESCRIPTOR_ALIGNMENT);
|
|
|
if (IS_MURAM_ERR(ugeth->send_q_mem_reg_offset)) {
|
|
|
ugeth_err
|
|
@@ -3064,7 +3052,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
}
|
|
|
|
|
|
ugeth->p_send_q_mem_reg =
|
|
|
- (ucc_geth_send_queue_mem_region_t *) qe_muram_addr(ugeth->
|
|
|
+ (struct ucc_geth_send_queue_mem_region *) qe_muram_addr(ugeth->
|
|
|
send_q_mem_reg_offset);
|
|
|
out_be32(&ugeth->p_tx_glbl_pram->sqptr, ugeth->send_q_mem_reg_offset);
|
|
|
|
|
@@ -3073,7 +3061,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
for (i = 0; i < ug_info->numQueuesTx; i++) {
|
|
|
endOfRing =
|
|
|
ugeth->p_tx_bd_ring[i] + (ug_info->bdRingLenTx[i] -
|
|
|
- 1) * UCC_GETH_SIZE_OF_BD;
|
|
|
+ 1) * sizeof(struct qe_bd);
|
|
|
if (ugeth->ug_info->uf_info.bd_mem_part == MEM_PART_SYSTEM) {
|
|
|
out_be32(&ugeth->p_send_q_mem_reg->sqqd[i].bd_ring_base,
|
|
|
(u32) virt_to_phys(ugeth->p_tx_bd_ring[i]));
|
|
@@ -3096,7 +3084,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
if (ug_info->numQueuesTx > 1) {
|
|
|
/* scheduler exists only if more than 1 tx queue */
|
|
|
ugeth->scheduler_offset =
|
|
|
- qe_muram_alloc(sizeof(ucc_geth_scheduler_t),
|
|
|
+ qe_muram_alloc(sizeof(struct ucc_geth_scheduler),
|
|
|
UCC_GETH_SCHEDULER_ALIGNMENT);
|
|
|
if (IS_MURAM_ERR(ugeth->scheduler_offset)) {
|
|
|
ugeth_err
|
|
@@ -3107,12 +3095,12 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
}
|
|
|
|
|
|
ugeth->p_scheduler =
|
|
|
- (ucc_geth_scheduler_t *) qe_muram_addr(ugeth->
|
|
|
+ (struct ucc_geth_scheduler *) qe_muram_addr(ugeth->
|
|
|
scheduler_offset);
|
|
|
out_be32(&ugeth->p_tx_glbl_pram->schedulerbasepointer,
|
|
|
ugeth->scheduler_offset);
|
|
|
/* Zero out p_scheduler */
|
|
|
- memset(ugeth->p_scheduler, 0, sizeof(ucc_geth_scheduler_t));
|
|
|
+ memset(ugeth->p_scheduler, 0, sizeof(struct ucc_geth_scheduler));
|
|
|
|
|
|
/* Set values in scheduler */
|
|
|
out_be32(&ugeth->p_scheduler->mblinterval,
|
|
@@ -3144,7 +3132,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
statisticsMode & UCC_GETH_STATISTICS_GATHERING_MODE_FIRMWARE_TX) {
|
|
|
ugeth->tx_fw_statistics_pram_offset =
|
|
|
qe_muram_alloc(sizeof
|
|
|
- (ucc_geth_tx_firmware_statistics_pram_t),
|
|
|
+ (struct ucc_geth_tx_firmware_statistics_pram),
|
|
|
UCC_GETH_TX_STATISTICS_ALIGNMENT);
|
|
|
if (IS_MURAM_ERR(ugeth->tx_fw_statistics_pram_offset)) {
|
|
|
ugeth_err
|
|
@@ -3154,11 +3142,11 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
ugeth->p_tx_fw_statistics_pram =
|
|
|
- (ucc_geth_tx_firmware_statistics_pram_t *)
|
|
|
+ (struct ucc_geth_tx_firmware_statistics_pram *)
|
|
|
qe_muram_addr(ugeth->tx_fw_statistics_pram_offset);
|
|
|
/* Zero out p_tx_fw_statistics_pram */
|
|
|
memset(ugeth->p_tx_fw_statistics_pram,
|
|
|
- 0, sizeof(ucc_geth_tx_firmware_statistics_pram_t));
|
|
|
+ 0, sizeof(struct ucc_geth_tx_firmware_statistics_pram));
|
|
|
}
|
|
|
|
|
|
/* temoder */
|
|
@@ -3183,7 +3171,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
/* Rx global PRAM */
|
|
|
/* Allocate global rx parameter RAM page */
|
|
|
ugeth->rx_glbl_pram_offset =
|
|
|
- qe_muram_alloc(sizeof(ucc_geth_rx_global_pram_t),
|
|
|
+ qe_muram_alloc(sizeof(struct ucc_geth_rx_global_pram),
|
|
|
UCC_GETH_RX_GLOBAL_PRAM_ALIGNMENT);
|
|
|
if (IS_MURAM_ERR(ugeth->rx_glbl_pram_offset)) {
|
|
|
ugeth_err
|
|
@@ -3193,10 +3181,10 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
ugeth->p_rx_glbl_pram =
|
|
|
- (ucc_geth_rx_global_pram_t *) qe_muram_addr(ugeth->
|
|
|
+ (struct ucc_geth_rx_global_pram *) qe_muram_addr(ugeth->
|
|
|
rx_glbl_pram_offset);
|
|
|
/* Zero out p_rx_glbl_pram */
|
|
|
- memset(ugeth->p_rx_glbl_pram, 0, sizeof(ucc_geth_rx_global_pram_t));
|
|
|
+ memset(ugeth->p_rx_glbl_pram, 0, sizeof(struct ucc_geth_rx_global_pram));
|
|
|
|
|
|
/* Fill global PRAM */
|
|
|
|
|
@@ -3204,7 +3192,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
/* Size varies with number of Rx threads */
|
|
|
ugeth->thread_dat_rx_offset =
|
|
|
qe_muram_alloc(numThreadsRxNumerical *
|
|
|
- sizeof(ucc_geth_thread_data_rx_t),
|
|
|
+ sizeof(struct ucc_geth_thread_data_rx),
|
|
|
UCC_GETH_THREAD_DATA_ALIGNMENT);
|
|
|
if (IS_MURAM_ERR(ugeth->thread_dat_rx_offset)) {
|
|
|
ugeth_err
|
|
@@ -3215,7 +3203,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
}
|
|
|
|
|
|
ugeth->p_thread_data_rx =
|
|
|
- (ucc_geth_thread_data_rx_t *) qe_muram_addr(ugeth->
|
|
|
+ (struct ucc_geth_thread_data_rx *) qe_muram_addr(ugeth->
|
|
|
thread_dat_rx_offset);
|
|
|
out_be32(&ugeth->p_rx_glbl_pram->rqptr, ugeth->thread_dat_rx_offset);
|
|
|
|
|
@@ -3227,7 +3215,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
statisticsMode & UCC_GETH_STATISTICS_GATHERING_MODE_FIRMWARE_RX) {
|
|
|
ugeth->rx_fw_statistics_pram_offset =
|
|
|
qe_muram_alloc(sizeof
|
|
|
- (ucc_geth_rx_firmware_statistics_pram_t),
|
|
|
+ (struct ucc_geth_rx_firmware_statistics_pram),
|
|
|
UCC_GETH_RX_STATISTICS_ALIGNMENT);
|
|
|
if (IS_MURAM_ERR(ugeth->rx_fw_statistics_pram_offset)) {
|
|
|
ugeth_err
|
|
@@ -3237,11 +3225,11 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
ugeth->p_rx_fw_statistics_pram =
|
|
|
- (ucc_geth_rx_firmware_statistics_pram_t *)
|
|
|
+ (struct ucc_geth_rx_firmware_statistics_pram *)
|
|
|
qe_muram_addr(ugeth->rx_fw_statistics_pram_offset);
|
|
|
/* Zero out p_rx_fw_statistics_pram */
|
|
|
memset(ugeth->p_rx_fw_statistics_pram, 0,
|
|
|
- sizeof(ucc_geth_rx_firmware_statistics_pram_t));
|
|
|
+ sizeof(struct ucc_geth_rx_firmware_statistics_pram));
|
|
|
}
|
|
|
|
|
|
/* intCoalescingPtr */
|
|
@@ -3249,7 +3237,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
/* Size varies with number of Rx queues */
|
|
|
ugeth->rx_irq_coalescing_tbl_offset =
|
|
|
qe_muram_alloc(ug_info->numQueuesRx *
|
|
|
- sizeof(ucc_geth_rx_interrupt_coalescing_entry_t),
|
|
|
+ sizeof(struct ucc_geth_rx_interrupt_coalescing_entry),
|
|
|
UCC_GETH_RX_INTERRUPT_COALESCING_ALIGNMENT);
|
|
|
if (IS_MURAM_ERR(ugeth->rx_irq_coalescing_tbl_offset)) {
|
|
|
ugeth_err
|
|
@@ -3260,7 +3248,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
}
|
|
|
|
|
|
ugeth->p_rx_irq_coalescing_tbl =
|
|
|
- (ucc_geth_rx_interrupt_coalescing_table_t *)
|
|
|
+ (struct ucc_geth_rx_interrupt_coalescing_table *)
|
|
|
qe_muram_addr(ugeth->rx_irq_coalescing_tbl_offset);
|
|
|
out_be32(&ugeth->p_rx_glbl_pram->intcoalescingptr,
|
|
|
ugeth->rx_irq_coalescing_tbl_offset);
|
|
@@ -3300,7 +3288,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
l3qt = 0;
|
|
|
for (i = 0; i < 8; i++)
|
|
|
l3qt |= (ug_info->l3qt[j + i] << (28 - 4 * i));
|
|
|
- out_be32(&ugeth->p_rx_glbl_pram->l3qt[j], l3qt);
|
|
|
+ out_be32(&ugeth->p_rx_glbl_pram->l3qt[j/8], l3qt);
|
|
|
}
|
|
|
|
|
|
/* vlantype */
|
|
@@ -3316,8 +3304,8 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
/* Size varies with number of Rx queues */
|
|
|
ugeth->rx_bd_qs_tbl_offset =
|
|
|
qe_muram_alloc(ug_info->numQueuesRx *
|
|
|
- (sizeof(ucc_geth_rx_bd_queues_entry_t) +
|
|
|
- sizeof(ucc_geth_rx_prefetched_bds_t)),
|
|
|
+ (sizeof(struct ucc_geth_rx_bd_queues_entry) +
|
|
|
+ sizeof(struct ucc_geth_rx_prefetched_bds)),
|
|
|
UCC_GETH_RX_BD_QUEUES_ALIGNMENT);
|
|
|
if (IS_MURAM_ERR(ugeth->rx_bd_qs_tbl_offset)) {
|
|
|
ugeth_err
|
|
@@ -3328,14 +3316,14 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
}
|
|
|
|
|
|
ugeth->p_rx_bd_qs_tbl =
|
|
|
- (ucc_geth_rx_bd_queues_entry_t *) qe_muram_addr(ugeth->
|
|
|
+ (struct ucc_geth_rx_bd_queues_entry *) qe_muram_addr(ugeth->
|
|
|
rx_bd_qs_tbl_offset);
|
|
|
out_be32(&ugeth->p_rx_glbl_pram->rbdqptr, ugeth->rx_bd_qs_tbl_offset);
|
|
|
/* Zero out p_rx_bd_qs_tbl */
|
|
|
memset(ugeth->p_rx_bd_qs_tbl,
|
|
|
0,
|
|
|
- ug_info->numQueuesRx * (sizeof(ucc_geth_rx_bd_queues_entry_t) +
|
|
|
- sizeof(ucc_geth_rx_prefetched_bds_t)));
|
|
|
+ ug_info->numQueuesRx * (sizeof(struct ucc_geth_rx_bd_queues_entry) +
|
|
|
+ sizeof(struct ucc_geth_rx_prefetched_bds)));
|
|
|
|
|
|
/* Setup the table */
|
|
|
/* Assume BD rings are already established */
|
|
@@ -3406,7 +3394,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
/* Allocate memory for extended filtering Mode Global
|
|
|
Parameters */
|
|
|
ugeth->exf_glbl_param_offset =
|
|
|
- qe_muram_alloc(sizeof(ucc_geth_exf_global_pram_t),
|
|
|
+ qe_muram_alloc(sizeof(struct ucc_geth_exf_global_pram),
|
|
|
UCC_GETH_RX_EXTENDED_FILTERING_GLOBAL_PARAMETERS_ALIGNMENT);
|
|
|
if (IS_MURAM_ERR(ugeth->exf_glbl_param_offset)) {
|
|
|
ugeth_err
|
|
@@ -3417,7 +3405,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
}
|
|
|
|
|
|
ugeth->p_exf_glbl_param =
|
|
|
- (ucc_geth_exf_global_pram_t *) qe_muram_addr(ugeth->
|
|
|
+ (struct ucc_geth_exf_global_pram *) qe_muram_addr(ugeth->
|
|
|
exf_glbl_param_offset);
|
|
|
out_be32(&ugeth->p_rx_glbl_pram->exfGlobalParam,
|
|
|
ugeth->exf_glbl_param_offset);
|
|
@@ -3439,7 +3427,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
INIT_LIST_HEAD(&ugeth->ind_hash_q);
|
|
|
}
|
|
|
p_82xx_addr_filt =
|
|
|
- (ucc_geth_82xx_address_filtering_pram_t *) ugeth->
|
|
|
+ (struct ucc_geth_82xx_address_filtering_pram *) ugeth->
|
|
|
p_rx_glbl_pram->addressfiltering;
|
|
|
|
|
|
ugeth_82xx_filtering_clear_all_addr_in_hash(ugeth,
|
|
@@ -3462,7 +3450,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
* allocated resources can be released when the channel is freed.
|
|
|
*/
|
|
|
if (!(ugeth->p_init_enet_param_shadow =
|
|
|
- (ucc_geth_init_pram_t *) kmalloc(sizeof(ucc_geth_init_pram_t),
|
|
|
+ (struct ucc_geth_init_pram *) kmalloc(sizeof(struct ucc_geth_init_pram),
|
|
|
GFP_KERNEL))) {
|
|
|
ugeth_err
|
|
|
("%s: Can not allocate memory for"
|
|
@@ -3472,7 +3460,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
}
|
|
|
/* Zero out *p_init_enet_param_shadow */
|
|
|
memset((char *)ugeth->p_init_enet_param_shadow,
|
|
|
- 0, sizeof(ucc_geth_init_pram_t));
|
|
|
+ 0, sizeof(struct ucc_geth_init_pram));
|
|
|
|
|
|
/* Fill shadow InitEnet command parameter structure */
|
|
|
|
|
@@ -3506,7 +3494,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
}
|
|
|
ugeth->p_init_enet_param_shadow->largestexternallookupkeysize =
|
|
|
ug_info->largestexternallookupkeysize;
|
|
|
- size = sizeof(ucc_geth_thread_rx_pram_t);
|
|
|
+ size = sizeof(struct ucc_geth_thread_rx_pram);
|
|
|
if (ug_info->rxExtendedFiltering) {
|
|
|
size += THREAD_RX_PRAM_ADDITIONAL_FOR_EXTENDED_FILTERING;
|
|
|
if (ug_info->largestexternallookupkeysize ==
|
|
@@ -3537,7 +3525,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
fill_init_enet_entries(ugeth,
|
|
|
&(ugeth->p_init_enet_param_shadow->
|
|
|
txthread[0]), numThreadsTxNumerical,
|
|
|
- sizeof(ucc_geth_thread_tx_pram_t),
|
|
|
+ sizeof(struct ucc_geth_thread_tx_pram),
|
|
|
UCC_GETH_THREAD_TX_PRAM_ALIGNMENT,
|
|
|
ug_info->riscTx, 0)) != 0) {
|
|
|
ugeth_err("%s: Can not fill p_init_enet_param_shadow.",
|
|
@@ -3557,7 +3545,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
}
|
|
|
|
|
|
/* Allocate InitEnet command parameter structure */
|
|
|
- init_enet_pram_offset = qe_muram_alloc(sizeof(ucc_geth_init_pram_t), 4);
|
|
|
+ init_enet_pram_offset = qe_muram_alloc(sizeof(struct ucc_geth_init_pram), 4);
|
|
|
if (IS_MURAM_ERR(init_enet_pram_offset)) {
|
|
|
ugeth_err
|
|
|
("%s: Can not allocate DPRAM memory for p_init_enet_pram.",
|
|
@@ -3566,7 +3554,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
return -ENOMEM;
|
|
|
}
|
|
|
p_init_enet_pram =
|
|
|
- (ucc_geth_init_pram_t *) qe_muram_addr(init_enet_pram_offset);
|
|
|
+ (struct ucc_geth_init_pram *) qe_muram_addr(init_enet_pram_offset);
|
|
|
|
|
|
/* Copy shadow InitEnet command parameter structure into PRAM */
|
|
|
p_init_enet_pram->resinit1 = ugeth->p_init_enet_param_shadow->resinit1;
|
|
@@ -3591,7 +3579,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
/* Issue QE command */
|
|
|
cecr_subblock =
|
|
|
ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.ucc_num);
|
|
|
- qe_issue_cmd(command, cecr_subblock, (u8) QE_CR_PROTOCOL_ETHERNET,
|
|
|
+ qe_issue_cmd(command, cecr_subblock, QE_CR_PROTOCOL_ETHERNET,
|
|
|
init_enet_pram_offset);
|
|
|
|
|
|
/* Free InitEnet command parameter */
|
|
@@ -3603,7 +3591,7 @@ static int ucc_geth_startup(ucc_geth_private_t *ugeth)
|
|
|
/* returns a net_device_stats structure pointer */
|
|
|
static struct net_device_stats *ucc_geth_get_stats(struct net_device *dev)
|
|
|
{
|
|
|
- ucc_geth_private_t *ugeth = netdev_priv(dev);
|
|
|
+ struct ucc_geth_private *ugeth = netdev_priv(dev);
|
|
|
|
|
|
return &(ugeth->stats);
|
|
|
}
|
|
@@ -3614,7 +3602,7 @@ static struct net_device_stats *ucc_geth_get_stats(struct net_device *dev)
|
|
|
* starting over will fix the problem. */
|
|
|
static void ucc_geth_timeout(struct net_device *dev)
|
|
|
{
|
|
|
- ucc_geth_private_t *ugeth = netdev_priv(dev);
|
|
|
+ struct ucc_geth_private *ugeth = netdev_priv(dev);
|
|
|
|
|
|
ugeth_vdbg("%s: IN", __FUNCTION__);
|
|
|
|
|
@@ -3634,7 +3622,7 @@ static void ucc_geth_timeout(struct net_device *dev)
|
|
|
/* It is pointed to by the dev->hard_start_xmit function pointer */
|
|
|
static int ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
{
|
|
|
- ucc_geth_private_t *ugeth = netdev_priv(dev);
|
|
|
+ struct ucc_geth_private *ugeth = netdev_priv(dev);
|
|
|
u8 *bd; /* BD pointer */
|
|
|
u32 bd_status;
|
|
|
u8 txQ = 0;
|
|
@@ -3647,7 +3635,7 @@ static int ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
|
|
|
/* Start from the next BD that should be filled */
|
|
|
bd = ugeth->txBd[txQ];
|
|
|
- bd_status = BD_STATUS_AND_LENGTH(bd);
|
|
|
+ bd_status = in_be32((u32 *)bd);
|
|
|
/* Save the skb pointer so we can free it later */
|
|
|
ugeth->tx_skbuff[txQ][ugeth->skb_curtx[txQ]] = skb;
|
|
|
|
|
@@ -3657,20 +3645,21 @@ static int ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
1) & TX_RING_MOD_MASK(ugeth->ug_info->bdRingLenTx[txQ]);
|
|
|
|
|
|
/* set up the buffer descriptor */
|
|
|
- BD_BUFFER_SET(bd,
|
|
|
+ out_be32(&((struct qe_bd *)bd)->buf,
|
|
|
dma_map_single(NULL, skb->data, skb->len, DMA_TO_DEVICE));
|
|
|
|
|
|
- //printk(KERN_DEBUG"skb->data is 0x%x\n",skb->data);
|
|
|
+ /* printk(KERN_DEBUG"skb->data is 0x%x\n",skb->data); */
|
|
|
|
|
|
bd_status = (bd_status & T_W) | T_R | T_I | T_L | skb->len;
|
|
|
|
|
|
- BD_STATUS_AND_LENGTH_SET(bd, bd_status);
|
|
|
+ /* set bd status and length */
|
|
|
+ out_be32((u32 *)bd, bd_status);
|
|
|
|
|
|
dev->trans_start = jiffies;
|
|
|
|
|
|
/* Move to next BD in the ring */
|
|
|
if (!(bd_status & T_W))
|
|
|
- ugeth->txBd[txQ] = bd + UCC_GETH_SIZE_OF_BD;
|
|
|
+ ugeth->txBd[txQ] = bd + sizeof(struct qe_bd);
|
|
|
else
|
|
|
ugeth->txBd[txQ] = ugeth->p_tx_bd_ring[txQ];
|
|
|
|
|
@@ -3695,7 +3684,7 @@ static int ucc_geth_start_xmit(struct sk_buff *skb, struct net_device *dev)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int ucc_geth_rx(ucc_geth_private_t *ugeth, u8 rxQ, int rx_work_limit)
|
|
|
+static int ucc_geth_rx(struct ucc_geth_private *ugeth, u8 rxQ, int rx_work_limit)
|
|
|
{
|
|
|
struct sk_buff *skb;
|
|
|
u8 *bd;
|
|
@@ -3709,11 +3698,11 @@ static int ucc_geth_rx(ucc_geth_private_t *ugeth, u8 rxQ, int rx_work_limit)
|
|
|
/* collect received buffers */
|
|
|
bd = ugeth->rxBd[rxQ];
|
|
|
|
|
|
- bd_status = BD_STATUS_AND_LENGTH(bd);
|
|
|
+ bd_status = in_be32((u32 *)bd);
|
|
|
|
|
|
/* while there are received buffers and BD is full (~R_E) */
|
|
|
while (!((bd_status & (R_E)) || (--rx_work_limit < 0))) {
|
|
|
- bdBuffer = (u8 *) BD_BUFFER(bd);
|
|
|
+ bdBuffer = (u8 *) in_be32(&((struct qe_bd *)bd)->buf);
|
|
|
length = (u16) ((bd_status & BD_LENGTH_MASK) - 4);
|
|
|
skb = ugeth->rx_skbuff[rxQ][ugeth->skb_currx[rxQ]];
|
|
|
|
|
@@ -3768,9 +3757,9 @@ static int ucc_geth_rx(ucc_geth_private_t *ugeth, u8 rxQ, int rx_work_limit)
|
|
|
if (bd_status & R_W)
|
|
|
bd = ugeth->p_rx_bd_ring[rxQ];
|
|
|
else
|
|
|
- bd += UCC_GETH_SIZE_OF_BD;
|
|
|
+ bd += sizeof(struct qe_bd);
|
|
|
|
|
|
- bd_status = BD_STATUS_AND_LENGTH(bd);
|
|
|
+ bd_status = in_be32((u32 *)bd);
|
|
|
}
|
|
|
|
|
|
ugeth->rxBd[rxQ] = bd;
|
|
@@ -3781,12 +3770,12 @@ static int ucc_geth_rx(ucc_geth_private_t *ugeth, u8 rxQ, int rx_work_limit)
|
|
|
static int ucc_geth_tx(struct net_device *dev, u8 txQ)
|
|
|
{
|
|
|
/* Start from the next BD that should be filled */
|
|
|
- ucc_geth_private_t *ugeth = netdev_priv(dev);
|
|
|
+ struct ucc_geth_private *ugeth = netdev_priv(dev);
|
|
|
u8 *bd; /* BD pointer */
|
|
|
u32 bd_status;
|
|
|
|
|
|
bd = ugeth->confBd[txQ];
|
|
|
- bd_status = BD_STATUS_AND_LENGTH(bd);
|
|
|
+ bd_status = in_be32((u32 *)bd);
|
|
|
|
|
|
/* Normal processing. */
|
|
|
while ((bd_status & T_R) == 0) {
|
|
@@ -3813,7 +3802,7 @@ static int ucc_geth_tx(struct net_device *dev, u8 txQ)
|
|
|
|
|
|
/* Advance the confirmation BD pointer */
|
|
|
if (!(bd_status & T_W))
|
|
|
- ugeth->confBd[txQ] += UCC_GETH_SIZE_OF_BD;
|
|
|
+ ugeth->confBd[txQ] += sizeof(struct qe_bd);
|
|
|
else
|
|
|
ugeth->confBd[txQ] = ugeth->p_tx_bd_ring[txQ];
|
|
|
}
|
|
@@ -3823,7 +3812,7 @@ static int ucc_geth_tx(struct net_device *dev, u8 txQ)
|
|
|
#ifdef CONFIG_UGETH_NAPI
|
|
|
static int ucc_geth_poll(struct net_device *dev, int *budget)
|
|
|
{
|
|
|
- ucc_geth_private_t *ugeth = netdev_priv(dev);
|
|
|
+ struct ucc_geth_private *ugeth = netdev_priv(dev);
|
|
|
int howmany;
|
|
|
int rx_work_limit = *budget;
|
|
|
u8 rxQ = 0;
|
|
@@ -3847,9 +3836,9 @@ static int ucc_geth_poll(struct net_device *dev, int *budget)
|
|
|
static irqreturn_t ucc_geth_irq_handler(int irq, void *info)
|
|
|
{
|
|
|
struct net_device *dev = (struct net_device *)info;
|
|
|
- ucc_geth_private_t *ugeth = netdev_priv(dev);
|
|
|
- ucc_fast_private_t *uccf;
|
|
|
- ucc_geth_info_t *ug_info;
|
|
|
+ struct ucc_geth_private *ugeth = netdev_priv(dev);
|
|
|
+ struct ucc_fast_private *uccf;
|
|
|
+ struct ucc_geth_info *ug_info;
|
|
|
register u32 ucce = 0;
|
|
|
register u32 bit_mask = UCCE_RXBF_SINGLE_MASK;
|
|
|
register u32 tx_mask = UCCE_TXBF_SINGLE_MASK;
|
|
@@ -3912,7 +3901,7 @@ static irqreturn_t ucc_geth_irq_handler(int irq, void *info)
|
|
|
static irqreturn_t phy_interrupt(int irq, void *dev_id)
|
|
|
{
|
|
|
struct net_device *dev = (struct net_device *)dev_id;
|
|
|
- ucc_geth_private_t *ugeth = netdev_priv(dev);
|
|
|
+ struct ucc_geth_private *ugeth = netdev_priv(dev);
|
|
|
|
|
|
ugeth_vdbg("%s: IN", __FUNCTION__);
|
|
|
|
|
@@ -3932,8 +3921,8 @@ static irqreturn_t phy_interrupt(int irq, void *dev_id)
|
|
|
static void ugeth_phy_change(void *data)
|
|
|
{
|
|
|
struct net_device *dev = (struct net_device *)data;
|
|
|
- ucc_geth_private_t *ugeth = netdev_priv(dev);
|
|
|
- ucc_geth_t *ug_regs;
|
|
|
+ struct ucc_geth_private *ugeth = netdev_priv(dev);
|
|
|
+ struct ucc_geth *ug_regs;
|
|
|
int result = 0;
|
|
|
|
|
|
ugeth_vdbg("%s: IN", __FUNCTION__);
|
|
@@ -3963,7 +3952,7 @@ static void ugeth_phy_change(void *data)
|
|
|
static void ugeth_phy_timer(unsigned long data)
|
|
|
{
|
|
|
struct net_device *dev = (struct net_device *)data;
|
|
|
- ucc_geth_private_t *ugeth = netdev_priv(dev);
|
|
|
+ struct ucc_geth_private *ugeth = netdev_priv(dev);
|
|
|
|
|
|
schedule_work(&ugeth->tq);
|
|
|
|
|
@@ -3979,7 +3968,7 @@ static void ugeth_phy_timer(unsigned long data)
|
|
|
static void ugeth_phy_startup_timer(unsigned long data)
|
|
|
{
|
|
|
struct ugeth_mii_info *mii_info = (struct ugeth_mii_info *)data;
|
|
|
- ucc_geth_private_t *ugeth = netdev_priv(mii_info->dev);
|
|
|
+ struct ucc_geth_private *ugeth = netdev_priv(mii_info->dev);
|
|
|
static int secondary = UGETH_AN_TIMEOUT;
|
|
|
int result;
|
|
|
|
|
@@ -4034,7 +4023,7 @@ static void ugeth_phy_startup_timer(unsigned long data)
|
|
|
/* Returns 0 for success. */
|
|
|
static int ucc_geth_open(struct net_device *dev)
|
|
|
{
|
|
|
- ucc_geth_private_t *ugeth = netdev_priv(dev);
|
|
|
+ struct ucc_geth_private *ugeth = netdev_priv(dev);
|
|
|
int err;
|
|
|
|
|
|
ugeth_vdbg("%s: IN", __FUNCTION__);
|
|
@@ -4111,7 +4100,7 @@ static int ucc_geth_open(struct net_device *dev)
|
|
|
/* Stops the kernel queue, and halts the controller */
|
|
|
static int ucc_geth_close(struct net_device *dev)
|
|
|
{
|
|
|
- ucc_geth_private_t *ugeth = netdev_priv(dev);
|
|
|
+ struct ucc_geth_private *ugeth = netdev_priv(dev);
|
|
|
|
|
|
ugeth_vdbg("%s: IN", __FUNCTION__);
|
|
|
|
|
@@ -4130,30 +4119,53 @@ static int ucc_geth_close(struct net_device *dev)
|
|
|
|
|
|
const struct ethtool_ops ucc_geth_ethtool_ops = { };
|
|
|
|
|
|
-static int ucc_geth_probe(struct device *device)
|
|
|
+static int ucc_geth_probe(struct of_device* ofdev, const struct of_device_id *match)
|
|
|
{
|
|
|
- struct platform_device *pdev = to_platform_device(device);
|
|
|
- struct ucc_geth_platform_data *ugeth_pdata;
|
|
|
+ struct device *device = &ofdev->dev;
|
|
|
+ struct device_node *np = ofdev->node;
|
|
|
struct net_device *dev = NULL;
|
|
|
struct ucc_geth_private *ugeth = NULL;
|
|
|
struct ucc_geth_info *ug_info;
|
|
|
- int err;
|
|
|
+ struct resource res;
|
|
|
+ struct device_node *phy;
|
|
|
+ int err, ucc_num, phy_interface;
|
|
|
static int mii_mng_configured = 0;
|
|
|
+ const phandle *ph;
|
|
|
+ const unsigned int *prop;
|
|
|
|
|
|
ugeth_vdbg("%s: IN", __FUNCTION__);
|
|
|
|
|
|
- ugeth_pdata = (struct ucc_geth_platform_data *)pdev->dev.platform_data;
|
|
|
+ prop = get_property(np, "device-id", NULL);
|
|
|
+ ucc_num = *prop - 1;
|
|
|
+ if ((ucc_num < 0) || (ucc_num > 7))
|
|
|
+ return -ENODEV;
|
|
|
+
|
|
|
+ ug_info = &ugeth_info[ucc_num];
|
|
|
+ ug_info->uf_info.ucc_num = ucc_num;
|
|
|
+ prop = get_property(np, "rx-clock", NULL);
|
|
|
+ ug_info->uf_info.rx_clock = *prop;
|
|
|
+ prop = get_property(np, "tx-clock", NULL);
|
|
|
+ ug_info->uf_info.tx_clock = *prop;
|
|
|
+ err = of_address_to_resource(np, 0, &res);
|
|
|
+ if (err)
|
|
|
+ return -EINVAL;
|
|
|
+
|
|
|
+ ug_info->uf_info.regs = res.start;
|
|
|
+ ug_info->uf_info.irq = irq_of_parse_and_map(np, 0);
|
|
|
+
|
|
|
+ ph = get_property(np, "phy-handle", NULL);
|
|
|
+ phy = of_find_node_by_phandle(*ph);
|
|
|
|
|
|
- ug_info = &ugeth_info[pdev->id];
|
|
|
- ug_info->uf_info.ucc_num = pdev->id;
|
|
|
- ug_info->uf_info.rx_clock = ugeth_pdata->rx_clock;
|
|
|
- ug_info->uf_info.tx_clock = ugeth_pdata->tx_clock;
|
|
|
- ug_info->uf_info.regs = ugeth_pdata->phy_reg_addr;
|
|
|
- ug_info->uf_info.irq = platform_get_irq(pdev, 0);
|
|
|
- ug_info->phy_address = ugeth_pdata->phy_id;
|
|
|
- ug_info->enet_interface = ugeth_pdata->phy_interface;
|
|
|
- ug_info->board_flags = ugeth_pdata->board_flags;
|
|
|
- ug_info->phy_interrupt = ugeth_pdata->phy_interrupt;
|
|
|
+ if (phy == NULL)
|
|
|
+ return -ENODEV;
|
|
|
+
|
|
|
+ prop = get_property(phy, "reg", NULL);
|
|
|
+ ug_info->phy_address = *prop;
|
|
|
+ prop = get_property(phy, "interface", NULL);
|
|
|
+ ug_info->enet_interface = *prop;
|
|
|
+ ug_info->phy_interrupt = irq_of_parse_and_map(phy, 0);
|
|
|
+ ug_info->board_flags = (ug_info->phy_interrupt == NO_IRQ)?
|
|
|
+ 0:FSL_UGETH_BRD_HAS_PHY_INTR;
|
|
|
|
|
|
printk(KERN_INFO "ucc_geth: UCC%1d at 0x%8x (irq = %d) \n",
|
|
|
ug_info->uf_info.ucc_num + 1, ug_info->uf_info.regs,
|
|
@@ -4161,12 +4173,44 @@ static int ucc_geth_probe(struct device *device)
|
|
|
|
|
|
if (ug_info == NULL) {
|
|
|
ugeth_err("%s: [%d] Missing additional data!", __FUNCTION__,
|
|
|
- pdev->id);
|
|
|
+ ucc_num);
|
|
|
return -ENODEV;
|
|
|
}
|
|
|
|
|
|
+ /* FIXME: Work around for early chip rev. */
|
|
|
+ /* There's a bug in initial chip rev(s) in the RGMII ac */
|
|
|
+ /* timing. */
|
|
|
+ /* The following compensates by writing to the reserved */
|
|
|
+ /* QE Port Output Hold Registers (CPOH1?). */
|
|
|
+ prop = get_property(phy, "interface", NULL);
|
|
|
+ phy_interface = *prop;
|
|
|
+ if ((phy_interface == ENET_1000_RGMII) ||
|
|
|
+ (phy_interface == ENET_100_RGMII) ||
|
|
|
+ (phy_interface == ENET_10_RGMII)) {
|
|
|
+ struct device_node *soc;
|
|
|
+ phys_addr_t immrbase = -1;
|
|
|
+ u32 *tmp_reg;
|
|
|
+ u32 tmp_val;
|
|
|
+
|
|
|
+ soc = of_find_node_by_type(NULL, "soc");
|
|
|
+ if (soc) {
|
|
|
+ unsigned int size;
|
|
|
+ const void *prop = get_property(soc, "reg", &size);
|
|
|
+ immrbase = of_translate_address(soc, prop);
|
|
|
+ of_node_put(soc);
|
|
|
+ };
|
|
|
+
|
|
|
+ tmp_reg = (u32 *) ioremap(immrbase + 0x14A8, 0x4);
|
|
|
+ tmp_val = in_be32(tmp_reg);
|
|
|
+ if (ucc_num == 1)
|
|
|
+ out_be32(tmp_reg, tmp_val | 0x00003000);
|
|
|
+ else if (ucc_num == 2)
|
|
|
+ out_be32(tmp_reg, tmp_val | 0x0c000000);
|
|
|
+ iounmap(tmp_reg);
|
|
|
+ }
|
|
|
+
|
|
|
if (!mii_mng_configured) {
|
|
|
- ucc_set_qe_mux_mii_mng(ug_info->uf_info.ucc_num);
|
|
|
+ ucc_set_qe_mux_mii_mng(ucc_num);
|
|
|
mii_mng_configured = 1;
|
|
|
}
|
|
|
|
|
@@ -4213,13 +4257,14 @@ static int ucc_geth_probe(struct device *device)
|
|
|
|
|
|
ugeth->ug_info = ug_info;
|
|
|
ugeth->dev = dev;
|
|
|
- memcpy(dev->dev_addr, ugeth_pdata->mac_addr, 6);
|
|
|
+ memcpy(dev->dev_addr, get_property(np, "mac-address", NULL), 6);
|
|
|
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-static int ucc_geth_remove(struct device *device)
|
|
|
+static int ucc_geth_remove(struct of_device* ofdev)
|
|
|
{
|
|
|
+ struct device *device = &ofdev->dev;
|
|
|
struct net_device *dev = dev_get_drvdata(device);
|
|
|
struct ucc_geth_private *ugeth = netdev_priv(dev);
|
|
|
|
|
@@ -4230,28 +4275,38 @@ static int ucc_geth_remove(struct device *device)
|
|
|
return 0;
|
|
|
}
|
|
|
|
|
|
-/* Structure for a device driver */
|
|
|
-static struct device_driver ucc_geth_driver = {
|
|
|
- .name = DRV_NAME,
|
|
|
- .bus = &platform_bus_type,
|
|
|
- .probe = ucc_geth_probe,
|
|
|
- .remove = ucc_geth_remove,
|
|
|
+static struct of_device_id ucc_geth_match[] = {
|
|
|
+ {
|
|
|
+ .type = "network",
|
|
|
+ .compatible = "ucc_geth",
|
|
|
+ },
|
|
|
+ {},
|
|
|
+};
|
|
|
+
|
|
|
+MODULE_DEVICE_TABLE(of, ucc_geth_match);
|
|
|
+
|
|
|
+static struct of_platform_driver ucc_geth_driver = {
|
|
|
+ .name = DRV_NAME,
|
|
|
+ .match_table = ucc_geth_match,
|
|
|
+ .probe = ucc_geth_probe,
|
|
|
+ .remove = ucc_geth_remove,
|
|
|
};
|
|
|
|
|
|
static int __init ucc_geth_init(void)
|
|
|
{
|
|
|
int i;
|
|
|
+
|
|
|
printk(KERN_INFO "ucc_geth: " DRV_DESC "\n");
|
|
|
for (i = 0; i < 8; i++)
|
|
|
memcpy(&(ugeth_info[i]), &ugeth_primary_info,
|
|
|
sizeof(ugeth_primary_info));
|
|
|
|
|
|
- return driver_register(&ucc_geth_driver);
|
|
|
+ return of_register_driver(&ucc_geth_driver);
|
|
|
}
|
|
|
|
|
|
static void __exit ucc_geth_exit(void)
|
|
|
{
|
|
|
- driver_unregister(&ucc_geth_driver);
|
|
|
+ of_unregister_driver(&ucc_geth_driver);
|
|
|
}
|
|
|
|
|
|
module_init(ucc_geth_init);
|