ucc_geth: Rearrange some code to avoid forward declarations
We'll need ugeth_disable() and ugeth_enable() calls earlier in the file, so rearrange some code to avoid forward declarations. The patch doesn't contain any functional changes. Signed-off-by: Anton Vorontsov <avorontsov@ru.mvista.com> Acked-by: Timur Tabi <timur@freescale.com> Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
parent
8ff44985c7
commit
7de8ee787e
|
@ -1412,6 +1412,155 @@ static int adjust_enet_interface(struct ucc_geth_private *ugeth)
|
|||
return 0;
|
||||
}
|
||||
|
||||
static int ugeth_graceful_stop_tx(struct ucc_geth_private *ugeth)
|
||||
{
|
||||
struct ucc_fast_private *uccf;
|
||||
u32 cecr_subblock;
|
||||
u32 temp;
|
||||
int i = 10;
|
||||
|
||||
uccf = ugeth->uccf;
|
||||
|
||||
/* Mask GRACEFUL STOP TX interrupt bit and clear it */
|
||||
clrbits32(uccf->p_uccm, UCC_GETH_UCCE_GRA);
|
||||
out_be32(uccf->p_ucce, UCC_GETH_UCCE_GRA); /* clear by writing 1 */
|
||||
|
||||
/* Issue host command */
|
||||
cecr_subblock =
|
||||
ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.ucc_num);
|
||||
qe_issue_cmd(QE_GRACEFUL_STOP_TX, cecr_subblock,
|
||||
QE_CR_PROTOCOL_ETHERNET, 0);
|
||||
|
||||
/* Wait for command to complete */
|
||||
do {
|
||||
msleep(10);
|
||||
temp = in_be32(uccf->p_ucce);
|
||||
} while (!(temp & UCC_GETH_UCCE_GRA) && --i);
|
||||
|
||||
uccf->stopped_tx = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ugeth_graceful_stop_rx(struct ucc_geth_private *ugeth)
|
||||
{
|
||||
struct ucc_fast_private *uccf;
|
||||
u32 cecr_subblock;
|
||||
u8 temp;
|
||||
int i = 10;
|
||||
|
||||
uccf = ugeth->uccf;
|
||||
|
||||
/* Clear acknowledge bit */
|
||||
temp = in_8(&ugeth->p_rx_glbl_pram->rxgstpack);
|
||||
temp &= ~GRACEFUL_STOP_ACKNOWLEDGE_RX;
|
||||
out_8(&ugeth->p_rx_glbl_pram->rxgstpack, temp);
|
||||
|
||||
/* Keep issuing command and checking acknowledge bit until
|
||||
it is asserted, according to spec */
|
||||
do {
|
||||
/* Issue host command */
|
||||
cecr_subblock =
|
||||
ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.
|
||||
ucc_num);
|
||||
qe_issue_cmd(QE_GRACEFUL_STOP_RX, cecr_subblock,
|
||||
QE_CR_PROTOCOL_ETHERNET, 0);
|
||||
msleep(10);
|
||||
temp = in_8(&ugeth->p_rx_glbl_pram->rxgstpack);
|
||||
} while (!(temp & GRACEFUL_STOP_ACKNOWLEDGE_RX) && --i);
|
||||
|
||||
uccf->stopped_rx = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ugeth_restart_tx(struct ucc_geth_private *ugeth)
|
||||
{
|
||||
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, QE_CR_PROTOCOL_ETHERNET, 0);
|
||||
uccf->stopped_tx = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ugeth_restart_rx(struct ucc_geth_private *ugeth)
|
||||
{
|
||||
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, QE_CR_PROTOCOL_ETHERNET,
|
||||
0);
|
||||
uccf->stopped_rx = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ugeth_enable(struct ucc_geth_private *ugeth, enum comm_dir mode)
|
||||
{
|
||||
struct ucc_fast_private *uccf;
|
||||
int enabled_tx, enabled_rx;
|
||||
|
||||
uccf = ugeth->uccf;
|
||||
|
||||
/* check if the UCC number is in range. */
|
||||
if (ugeth->ug_info->uf_info.ucc_num >= UCC_MAX_NUM) {
|
||||
if (netif_msg_probe(ugeth))
|
||||
ugeth_err("%s: ucc_num out of range.", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
enabled_tx = uccf->enabled_tx;
|
||||
enabled_rx = uccf->enabled_rx;
|
||||
|
||||
/* Get Tx and Rx going again, in case this channel was actively
|
||||
disabled. */
|
||||
if ((mode & COMM_DIR_TX) && (!enabled_tx) && uccf->stopped_tx)
|
||||
ugeth_restart_tx(ugeth);
|
||||
if ((mode & COMM_DIR_RX) && (!enabled_rx) && uccf->stopped_rx)
|
||||
ugeth_restart_rx(ugeth);
|
||||
|
||||
ucc_fast_enable(uccf, mode); /* OK to do even if not disabled */
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static int ugeth_disable(struct ucc_geth_private *ugeth, enum comm_dir mode)
|
||||
{
|
||||
struct ucc_fast_private *uccf;
|
||||
|
||||
uccf = ugeth->uccf;
|
||||
|
||||
/* check if the UCC number is in range. */
|
||||
if (ugeth->ug_info->uf_info.ucc_num >= UCC_MAX_NUM) {
|
||||
if (netif_msg_probe(ugeth))
|
||||
ugeth_err("%s: ucc_num out of range.", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Stop any transmissions */
|
||||
if ((mode & COMM_DIR_TX) && uccf->enabled_tx && !uccf->stopped_tx)
|
||||
ugeth_graceful_stop_tx(ugeth);
|
||||
|
||||
/* Stop any receptions */
|
||||
if ((mode & COMM_DIR_RX) && uccf->enabled_rx && !uccf->stopped_rx)
|
||||
ugeth_graceful_stop_rx(ugeth);
|
||||
|
||||
ucc_fast_disable(ugeth->uccf, mode); /* OK to do even if not enabled */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Called every time the controller might need to be made
|
||||
* aware of new link state. The PHY code conveys this
|
||||
* information through variables in the ugeth structure, and this
|
||||
|
@ -1587,157 +1736,6 @@ static int init_phy(struct net_device *dev)
|
|||
return 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int ugeth_graceful_stop_tx(struct ucc_geth_private *ugeth)
|
||||
{
|
||||
struct ucc_fast_private *uccf;
|
||||
u32 cecr_subblock;
|
||||
u32 temp;
|
||||
int i = 10;
|
||||
|
||||
uccf = ugeth->uccf;
|
||||
|
||||
/* Mask GRACEFUL STOP TX interrupt bit and clear it */
|
||||
clrbits32(uccf->p_uccm, UCC_GETH_UCCE_GRA);
|
||||
out_be32(uccf->p_ucce, UCC_GETH_UCCE_GRA); /* clear by writing 1 */
|
||||
|
||||
/* Issue host command */
|
||||
cecr_subblock =
|
||||
ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.ucc_num);
|
||||
qe_issue_cmd(QE_GRACEFUL_STOP_TX, cecr_subblock,
|
||||
QE_CR_PROTOCOL_ETHERNET, 0);
|
||||
|
||||
/* Wait for command to complete */
|
||||
do {
|
||||
msleep(10);
|
||||
temp = in_be32(uccf->p_ucce);
|
||||
} while (!(temp & UCC_GETH_UCCE_GRA) && --i);
|
||||
|
||||
uccf->stopped_tx = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ugeth_graceful_stop_rx(struct ucc_geth_private * ugeth)
|
||||
{
|
||||
struct ucc_fast_private *uccf;
|
||||
u32 cecr_subblock;
|
||||
u8 temp;
|
||||
int i = 10;
|
||||
|
||||
uccf = ugeth->uccf;
|
||||
|
||||
/* Clear acknowledge bit */
|
||||
temp = in_8(&ugeth->p_rx_glbl_pram->rxgstpack);
|
||||
temp &= ~GRACEFUL_STOP_ACKNOWLEDGE_RX;
|
||||
out_8(&ugeth->p_rx_glbl_pram->rxgstpack, temp);
|
||||
|
||||
/* Keep issuing command and checking acknowledge bit until
|
||||
it is asserted, according to spec */
|
||||
do {
|
||||
/* Issue host command */
|
||||
cecr_subblock =
|
||||
ucc_fast_get_qe_cr_subblock(ugeth->ug_info->uf_info.
|
||||
ucc_num);
|
||||
qe_issue_cmd(QE_GRACEFUL_STOP_RX, cecr_subblock,
|
||||
QE_CR_PROTOCOL_ETHERNET, 0);
|
||||
msleep(10);
|
||||
temp = in_8(&ugeth->p_rx_glbl_pram->rxgstpack);
|
||||
} while (!(temp & GRACEFUL_STOP_ACKNOWLEDGE_RX) && --i);
|
||||
|
||||
uccf->stopped_rx = 1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ugeth_restart_tx(struct ucc_geth_private *ugeth)
|
||||
{
|
||||
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, QE_CR_PROTOCOL_ETHERNET, 0);
|
||||
uccf->stopped_tx = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ugeth_restart_rx(struct ucc_geth_private *ugeth)
|
||||
{
|
||||
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, QE_CR_PROTOCOL_ETHERNET,
|
||||
0);
|
||||
uccf->stopped_rx = 0;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int ugeth_enable(struct ucc_geth_private *ugeth, enum comm_dir mode)
|
||||
{
|
||||
struct ucc_fast_private *uccf;
|
||||
int enabled_tx, enabled_rx;
|
||||
|
||||
uccf = ugeth->uccf;
|
||||
|
||||
/* check if the UCC number is in range. */
|
||||
if (ugeth->ug_info->uf_info.ucc_num >= UCC_MAX_NUM) {
|
||||
if (netif_msg_probe(ugeth))
|
||||
ugeth_err("%s: ucc_num out of range.", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
enabled_tx = uccf->enabled_tx;
|
||||
enabled_rx = uccf->enabled_rx;
|
||||
|
||||
/* Get Tx and Rx going again, in case this channel was actively
|
||||
disabled. */
|
||||
if ((mode & COMM_DIR_TX) && (!enabled_tx) && uccf->stopped_tx)
|
||||
ugeth_restart_tx(ugeth);
|
||||
if ((mode & COMM_DIR_RX) && (!enabled_rx) && uccf->stopped_rx)
|
||||
ugeth_restart_rx(ugeth);
|
||||
|
||||
ucc_fast_enable(uccf, mode); /* OK to do even if not disabled */
|
||||
|
||||
return 0;
|
||||
|
||||
}
|
||||
|
||||
static int ugeth_disable(struct ucc_geth_private * ugeth, enum comm_dir mode)
|
||||
{
|
||||
struct ucc_fast_private *uccf;
|
||||
|
||||
uccf = ugeth->uccf;
|
||||
|
||||
/* check if the UCC number is in range. */
|
||||
if (ugeth->ug_info->uf_info.ucc_num >= UCC_MAX_NUM) {
|
||||
if (netif_msg_probe(ugeth))
|
||||
ugeth_err("%s: ucc_num out of range.", __func__);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
/* Stop any transmissions */
|
||||
if ((mode & COMM_DIR_TX) && uccf->enabled_tx && !uccf->stopped_tx)
|
||||
ugeth_graceful_stop_tx(ugeth);
|
||||
|
||||
/* Stop any receptions */
|
||||
if ((mode & COMM_DIR_RX) && uccf->enabled_rx && !uccf->stopped_rx)
|
||||
ugeth_graceful_stop_rx(ugeth);
|
||||
|
||||
ucc_fast_disable(ugeth->uccf, mode); /* OK to do even if not enabled */
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void ugeth_dump_regs(struct ucc_geth_private *ugeth)
|
||||
{
|
||||
#ifdef DEBUG
|
||||
|
|
Loading…
Reference in New Issue