staging: cxt1e1: remove unneeded mkret() calls
The mkret() change a value of error from positive to negative. This patch is modified to return negative value when it failed. It doesn't need to call with function for changing from positive to negative. Signed-off-by: Daeseok Youn <daeseok.youn@gmail.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
6f2c9efa66
commit
2ebd09aced
|
@ -145,16 +145,6 @@ get_hdlc_name(hdlc_device *hdlc)
|
||||||
return dev->name;
|
return dev->name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
static status_t
|
|
||||||
mkret(int bsd)
|
|
||||||
{
|
|
||||||
if (bsd > 0)
|
|
||||||
return -bsd;
|
|
||||||
else
|
|
||||||
return bsd;
|
|
||||||
}
|
|
||||||
|
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
#include <linux/workqueue.h>
|
#include <linux/workqueue.h>
|
||||||
|
|
||||||
|
@ -290,8 +280,8 @@ chan_open(struct net_device *ndev)
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = c4_chan_up(priv->ci, priv->channum);
|
ret = c4_chan_up(priv->ci, priv->channum);
|
||||||
if (ret)
|
if (ret < 0)
|
||||||
return -ret;
|
return ret;
|
||||||
try_module_get(THIS_MODULE);
|
try_module_get(THIS_MODULE);
|
||||||
netif_start_queue(ndev);
|
netif_start_queue(ndev);
|
||||||
return 0; /* no error = success */
|
return 0; /* no error = success */
|
||||||
|
@ -521,8 +511,8 @@ do_get_port(struct net_device *ndev, void *data)
|
||||||
if (!ci)
|
if (!ci)
|
||||||
return -EINVAL; /* get card info */
|
return -EINVAL; /* get card info */
|
||||||
|
|
||||||
ret = mkret(c4_get_port(ci, pp.portnum));
|
ret = c4_get_port(ci, pp.portnum);
|
||||||
if (ret)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
if (copy_to_user(data, &ci->port[pp.portnum].p,
|
if (copy_to_user(data, &ci->port[pp.portnum].p,
|
||||||
sizeof(struct sbecom_port_param)))
|
sizeof(struct sbecom_port_param)))
|
||||||
|
@ -549,7 +539,7 @@ do_set_port(struct net_device *ndev, void *data)
|
||||||
return -ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
memcpy(&ci->port[pp.portnum].p, &pp, sizeof(struct sbecom_port_param));
|
memcpy(&ci->port[pp.portnum].p, &pp, sizeof(struct sbecom_port_param));
|
||||||
return mkret(c4_set_port(ci, pp.portnum));
|
return c4_set_port(ci, pp.portnum);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* work the port loopback mode as per directed */
|
/* work the port loopback mode as per directed */
|
||||||
|
@ -564,7 +554,7 @@ do_port_loop(struct net_device *ndev, void *data)
|
||||||
ci = get_ci_by_dev(ndev);
|
ci = get_ci_by_dev(ndev);
|
||||||
if (!ci)
|
if (!ci)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
return mkret(c4_loop_port(ci, pp.portnum, pp.port_mode));
|
return c4_loop_port(ci, pp.portnum, pp.port_mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* set the specified register with the given value / or just read it */
|
/* set the specified register with the given value / or just read it */
|
||||||
|
@ -580,8 +570,8 @@ do_framer_rw(struct net_device *ndev, void *data)
|
||||||
ci = get_ci_by_dev(ndev);
|
ci = get_ci_by_dev(ndev);
|
||||||
if (!ci)
|
if (!ci)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
ret = mkret(c4_frame_rw(ci, &pp));
|
ret = c4_frame_rw(ci, &pp);
|
||||||
if (ret)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
if (copy_to_user(data, &pp, sizeof(struct sbecom_port_param)))
|
if (copy_to_user(data, &pp, sizeof(struct sbecom_port_param)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
@ -601,7 +591,8 @@ do_pld_rw(struct net_device *ndev, void *data)
|
||||||
ci = get_ci_by_dev(ndev);
|
ci = get_ci_by_dev(ndev);
|
||||||
if (!ci)
|
if (!ci)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
ret = mkret(c4_pld_rw(ci, &pp));
|
|
||||||
|
ret = c4_pld_rw(ci, &pp);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
if (copy_to_user(data, &pp, sizeof(struct sbecom_port_param)))
|
if (copy_to_user(data, &pp, sizeof(struct sbecom_port_param)))
|
||||||
|
@ -622,8 +613,8 @@ do_musycc_rw(struct net_device *ndev, void *data)
|
||||||
ci = get_ci_by_dev(ndev);
|
ci = get_ci_by_dev(ndev);
|
||||||
if (!ci)
|
if (!ci)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
ret = mkret(c4_musycc_rw(ci, &mp));
|
ret = c4_musycc_rw(ci, &mp);
|
||||||
if (ret)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
if (copy_to_user(data, &mp, sizeof(struct c4_musycc_param)))
|
if (copy_to_user(data, &mp, sizeof(struct c4_musycc_param)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
@ -640,8 +631,8 @@ do_get_chan(struct net_device *ndev, void *data)
|
||||||
sizeof(struct sbecom_chan_param)))
|
sizeof(struct sbecom_chan_param)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
ret = mkret(c4_get_chan(cp.channum, &cp));
|
ret = c4_get_chan(cp.channum, &cp);
|
||||||
if (ret)
|
if (ret < 0)
|
||||||
return ret;
|
return ret;
|
||||||
|
|
||||||
if (copy_to_user(data, &cp, sizeof(struct sbecom_chan_param)))
|
if (copy_to_user(data, &cp, sizeof(struct sbecom_chan_param)))
|
||||||
|
@ -653,7 +644,6 @@ static status_t
|
||||||
do_set_chan(struct net_device *ndev, void *data)
|
do_set_chan(struct net_device *ndev, void *data)
|
||||||
{
|
{
|
||||||
struct sbecom_chan_param cp;
|
struct sbecom_chan_param cp;
|
||||||
int ret;
|
|
||||||
ci_t *ci;
|
ci_t *ci;
|
||||||
|
|
||||||
if (copy_from_user(&cp, data, sizeof(struct sbecom_chan_param)))
|
if (copy_from_user(&cp, data, sizeof(struct sbecom_chan_param)))
|
||||||
|
@ -661,13 +651,7 @@ do_set_chan(struct net_device *ndev, void *data)
|
||||||
ci = get_ci_by_dev(ndev);
|
ci = get_ci_by_dev(ndev);
|
||||||
if (!ci)
|
if (!ci)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
switch (ret = mkret(c4_set_chan(cp.channum, &cp)))
|
return c4_set_chan(cp.channum, &cp);
|
||||||
{
|
|
||||||
case 0:
|
|
||||||
return 0;
|
|
||||||
default:
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
|
@ -686,8 +670,8 @@ do_create_chan(struct net_device *ndev, void *data)
|
||||||
dev = create_chan(ndev, ci, &cp);
|
dev = create_chan(ndev, ci, &cp);
|
||||||
if (!dev)
|
if (!dev)
|
||||||
return -EBUSY;
|
return -EBUSY;
|
||||||
ret = mkret(c4_new_chan(ci, cp.port, cp.channum, dev));
|
ret = c4_new_chan(ci, cp.port, cp.channum, dev);
|
||||||
if (ret) {
|
if (ret < 0) {
|
||||||
/* needed due to Ioctl calling sequence */
|
/* needed due to Ioctl calling sequence */
|
||||||
rtnl_unlock();
|
rtnl_unlock();
|
||||||
unregister_hdlc_device(dev);
|
unregister_hdlc_device(dev);
|
||||||
|
@ -707,13 +691,11 @@ do_get_chan_stats(struct net_device *ndev, void *data)
|
||||||
if (copy_from_user(&ccs, data,
|
if (copy_from_user(&ccs, data,
|
||||||
sizeof(struct c4_chan_stats_wrap)))
|
sizeof(struct c4_chan_stats_wrap)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
switch (ret = mkret(c4_get_chan_stats(ccs.channum, &ccs.stats)))
|
|
||||||
{
|
ret = c4_get_chan_stats(ccs.channum, &ccs.stats);
|
||||||
case 0:
|
if (ret < 0)
|
||||||
break;
|
|
||||||
default:
|
|
||||||
return ret;
|
return ret;
|
||||||
}
|
|
||||||
if (copy_to_user(data, &ccs,
|
if (copy_to_user(data, &ccs,
|
||||||
sizeof(struct c4_chan_stats_wrap)))
|
sizeof(struct c4_chan_stats_wrap)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
@ -821,7 +803,7 @@ do_reset_chan_stats(struct net_device *musycc_dev, void *data)
|
||||||
if (copy_from_user(&cp, data,
|
if (copy_from_user(&cp, data,
|
||||||
sizeof(struct sbecom_chan_param)))
|
sizeof(struct sbecom_chan_param)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return mkret(c4_del_chan_stats(cp.channum));
|
return c4_del_chan_stats(cp.channum);
|
||||||
}
|
}
|
||||||
|
|
||||||
static status_t
|
static status_t
|
||||||
|
@ -931,7 +913,7 @@ c4_ioctl(struct net_device *ndev, struct ifreq *ifr, int cmd)
|
||||||
ret = -EINVAL;
|
ret = -EINVAL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return mkret(ret);
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static const struct net_device_ops c4_ops = {
|
static const struct net_device_ops c4_ops = {
|
||||||
|
@ -957,7 +939,7 @@ c4_add_dev(hdw_info_t *hi, int brdno, unsigned long f0, unsigned long f1,
|
||||||
if (!ndev) {
|
if (!ndev) {
|
||||||
pr_warning("%s: no memory for struct net_device !\n",
|
pr_warning("%s: no memory for struct net_device !\n",
|
||||||
hi->devname);
|
hi->devname);
|
||||||
error_flag = ENOMEM;
|
error_flag = -ENOMEM;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
ci = (ci_t *)(netdev_priv(ndev));
|
ci = (ci_t *)(netdev_priv(ndev));
|
||||||
|
@ -992,7 +974,7 @@ c4_add_dev(hdw_info_t *hi, int brdno, unsigned long f0, unsigned long f1,
|
||||||
(c4_init(ci, (u_char *) f0, (u_char *) f1) != SBE_DRVR_SUCCESS)) {
|
(c4_init(ci, (u_char *) f0, (u_char *) f1) != SBE_DRVR_SUCCESS)) {
|
||||||
OS_kfree(netdev_priv(ndev));
|
OS_kfree(netdev_priv(ndev));
|
||||||
OS_kfree(ndev);
|
OS_kfree(ndev);
|
||||||
error_flag = ENODEV;
|
error_flag = -ENODEV;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
/*************************************************************
|
/*************************************************************
|
||||||
|
@ -1018,7 +1000,7 @@ c4_add_dev(hdw_info_t *hi, int brdno, unsigned long f0, unsigned long f1,
|
||||||
unregister_netdev(ndev);
|
unregister_netdev(ndev);
|
||||||
OS_kfree(netdev_priv(ndev));
|
OS_kfree(netdev_priv(ndev));
|
||||||
OS_kfree(ndev);
|
OS_kfree(ndev);
|
||||||
error_flag = EIO;
|
error_flag = -EIO;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#ifdef CONFIG_SBE_PMCC4_NCOMM
|
#ifdef CONFIG_SBE_PMCC4_NCOMM
|
||||||
|
@ -1028,7 +1010,7 @@ c4_add_dev(hdw_info_t *hi, int brdno, unsigned long f0, unsigned long f1,
|
||||||
free_irq(irq0, ndev);
|
free_irq(irq0, ndev);
|
||||||
OS_kfree(netdev_priv(ndev));
|
OS_kfree(netdev_priv(ndev));
|
||||||
OS_kfree(ndev);
|
OS_kfree(ndev);
|
||||||
error_flag = EIO;
|
error_flag = -EIO;
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -1550,7 +1550,7 @@ musycc_chan_down(ci_t *dummy, int channum)
|
||||||
|
|
||||||
ch = sd_find_chan(dummy, channum);
|
ch = sd_find_chan(dummy, channum);
|
||||||
if (!ch)
|
if (!ch)
|
||||||
return EINVAL;
|
return -EINVAL;
|
||||||
pi = ch->up;
|
pi = ch->up;
|
||||||
gchan = ch->gchan;
|
gchan = ch->gchan;
|
||||||
|
|
||||||
|
|
|
@ -757,7 +757,7 @@ c4_frame_rw (ci_t *ci, struct sbecom_port_param *pp)
|
||||||
volatile u_int32_t data;
|
volatile u_int32_t data;
|
||||||
|
|
||||||
if (pp->portnum >= ci->max_port)/* sanity check */
|
if (pp->portnum >= ci->max_port)/* sanity check */
|
||||||
return ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
comet = ci->port[pp->portnum].cometbase;
|
comet = ci->port[pp->portnum].cometbase;
|
||||||
data = pci_read_32 ((u_int32_t *) comet + pp->port_mode) & 0xff;
|
data = pci_read_32 ((u_int32_t *) comet + pp->port_mode) & 0xff;
|
||||||
|
@ -846,7 +846,7 @@ c4_musycc_rw (ci_t *ci, struct c4_musycc_param *mcp)
|
||||||
*/
|
*/
|
||||||
portnum = (mcp->offset % 0x6000) / 0x800;
|
portnum = (mcp->offset % 0x6000) / 0x800;
|
||||||
if (portnum >= ci->max_port)
|
if (portnum >= ci->max_port)
|
||||||
return ENXIO;
|
return -ENXIO;
|
||||||
pi = &ci->port[portnum];
|
pi = &ci->port[portnum];
|
||||||
if (mcp->offset >= 0x6000)
|
if (mcp->offset >= 0x6000)
|
||||||
offset += 0x6000; /* put back in MsgCfgDesc address offset */
|
offset += 0x6000; /* put back in MsgCfgDesc address offset */
|
||||||
|
@ -895,7 +895,7 @@ status_t
|
||||||
c4_get_port (ci_t *ci, int portnum)
|
c4_get_port (ci_t *ci, int portnum)
|
||||||
{
|
{
|
||||||
if (portnum >= ci->max_port) /* sanity check */
|
if (portnum >= ci->max_port) /* sanity check */
|
||||||
return ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
SD_SEM_TAKE (&ci->sem_wdbusy, "_wd_"); /* only 1 thru here, per
|
SD_SEM_TAKE (&ci->sem_wdbusy, "_wd_"); /* only 1 thru here, per
|
||||||
* board */
|
* board */
|
||||||
|
@ -916,7 +916,7 @@ c4_set_port (ci_t *ci, int portnum)
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
if (portnum >= ci->max_port) /* sanity check */
|
if (portnum >= ci->max_port) /* sanity check */
|
||||||
return ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
pi = &ci->port[portnum];
|
pi = &ci->port[portnum];
|
||||||
pp = &ci->port[portnum].p;
|
pp = &ci->port[portnum].p;
|
||||||
|
@ -928,7 +928,7 @@ c4_set_port (ci_t *ci, int portnum)
|
||||||
portnum, e1mode, pi->openchans);
|
portnum, e1mode, pi->openchans);
|
||||||
}
|
}
|
||||||
if (pi->openchans)
|
if (pi->openchans)
|
||||||
return EBUSY; /* group needs initialization only for
|
return -EBUSY; /* group needs initialization only for
|
||||||
* first channel of a group */
|
* first channel of a group */
|
||||||
|
|
||||||
{
|
{
|
||||||
|
@ -1019,10 +1019,10 @@ c4_new_chan (ci_t *ci, int portnum, int channum, void *user)
|
||||||
int gchan;
|
int gchan;
|
||||||
|
|
||||||
if (c4_find_chan (channum)) /* a new channel shouldn't already exist */
|
if (c4_find_chan (channum)) /* a new channel shouldn't already exist */
|
||||||
return EEXIST;
|
return -EEXIST;
|
||||||
|
|
||||||
if (portnum >= ci->max_port) /* sanity check */
|
if (portnum >= ci->max_port) /* sanity check */
|
||||||
return ENXIO;
|
return -ENXIO;
|
||||||
|
|
||||||
pi = &(ci->port[portnum]);
|
pi = &(ci->port[portnum]);
|
||||||
/* find any available channel within this port */
|
/* find any available channel within this port */
|
||||||
|
@ -1033,7 +1033,7 @@ c4_new_chan (ci_t *ci, int portnum, int channum, void *user)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (gchan == MUSYCC_NCHANS) /* exhausted table, all were assigned */
|
if (gchan == MUSYCC_NCHANS) /* exhausted table, all were assigned */
|
||||||
return ENFILE;
|
return -ENFILE;
|
||||||
|
|
||||||
ch->up = pi;
|
ch->up = pi;
|
||||||
|
|
||||||
|
@ -1084,6 +1084,7 @@ c4_del_chan (int channum)
|
||||||
ch = c4_find_chan(channum);
|
ch = c4_find_chan(channum);
|
||||||
if (!ch)
|
if (!ch)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
||||||
if (ch->state == UP)
|
if (ch->state == UP)
|
||||||
musycc_chan_down ((ci_t *) 0, channum);
|
musycc_chan_down ((ci_t *) 0, channum);
|
||||||
ch->state = UNASSIGNED;
|
ch->state = UNASSIGNED;
|
||||||
|
@ -1121,12 +1122,12 @@ c4_set_chan (int channum, struct sbecom_chan_param *p)
|
||||||
if (ch->p.card != p->card ||
|
if (ch->p.card != p->card ||
|
||||||
ch->p.port != p->port ||
|
ch->p.port != p->port ||
|
||||||
ch->p.channum != p->channum)
|
ch->p.channum != p->channum)
|
||||||
return EINVAL;
|
return -EINVAL;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (!(ch->up->group_is_set))
|
if (!(ch->up->group_is_set))
|
||||||
{
|
{
|
||||||
return EIO; /* out of order, SET_PORT command
|
return -EIO; /* out of order, SET_PORT command
|
||||||
* required prior to first group's
|
* required prior to first group's
|
||||||
* SET_CHAN command */
|
* SET_CHAN command */
|
||||||
}
|
}
|
||||||
|
@ -1169,6 +1170,7 @@ c4_get_chan (int channum, struct sbecom_chan_param *p)
|
||||||
ch = c4_find_chan(channum);
|
ch = c4_find_chan(channum);
|
||||||
if (!ch)
|
if (!ch)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
||||||
*p = ch->p;
|
*p = ch->p;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -1181,6 +1183,7 @@ c4_get_chan_stats (int channum, struct sbecom_chan_stats *p)
|
||||||
ch = c4_find_chan(channum);
|
ch = c4_find_chan(channum);
|
||||||
if (!ch)
|
if (!ch)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
||||||
*p = ch->s;
|
*p = ch->s;
|
||||||
p->tx_pending = atomic_read (&ch->tx_pending);
|
p->tx_pending = atomic_read (&ch->tx_pending);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1252,6 +1255,7 @@ c4_chan_up (ci_t *ci, int channum)
|
||||||
ch = c4_find_chan(channum);
|
ch = c4_find_chan(channum);
|
||||||
if (!ch)
|
if (!ch)
|
||||||
return -ENOENT;
|
return -ENOENT;
|
||||||
|
|
||||||
if (ch->state == UP)
|
if (ch->state == UP)
|
||||||
{
|
{
|
||||||
if (cxt1e1_log_level >= LOG_MONITOR)
|
if (cxt1e1_log_level >= LOG_MONITOR)
|
||||||
|
@ -1274,7 +1278,7 @@ c4_chan_up (ci_t *ci, int channum)
|
||||||
pr_info("+ ask4 %x, currently %x\n",
|
pr_info("+ ask4 %x, currently %x\n",
|
||||||
ch->p.bitmask[i], pi->tsm[i]);
|
ch->p.bitmask[i], pi->tsm[i]);
|
||||||
}
|
}
|
||||||
return EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
for (j = 0; j < 8; j++)
|
for (j = 0; j < 8; j++)
|
||||||
if (ch->p.bitmask[i] & (1 << j))
|
if (ch->p.bitmask[i] & (1 << j))
|
||||||
|
@ -1287,7 +1291,7 @@ c4_chan_up (ci_t *ci, int channum)
|
||||||
/* if( cxt1e1_log_level >= LOG_WARN) */
|
/* if( cxt1e1_log_level >= LOG_WARN) */
|
||||||
pr_info("%s: c4_chan_up[%d] ENOBUFS (no TimeSlots assigned)\n",
|
pr_info("%s: c4_chan_up[%d] ENOBUFS (no TimeSlots assigned)\n",
|
||||||
ci->devname, channum);
|
ci->devname, channum);
|
||||||
return ENOBUFS; /* this should not happen */
|
return -ENOBUFS; /* this should not happen */
|
||||||
}
|
}
|
||||||
addr = c4_fifo_alloc (pi, gchan, &nbuf);
|
addr = c4_fifo_alloc (pi, gchan, &nbuf);
|
||||||
ch->state = UP;
|
ch->state = UP;
|
||||||
|
@ -1465,7 +1469,7 @@ errfree:
|
||||||
ch->mdr = NULL;
|
ch->mdr = NULL;
|
||||||
ch->rxd_num = 0;
|
ch->rxd_num = 0;
|
||||||
ch->state = DOWN;
|
ch->state = DOWN;
|
||||||
return ENOBUFS;
|
return -ENOBUFS;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* stop the hardware from servicing & interrupting */
|
/* stop the hardware from servicing & interrupting */
|
||||||
|
|
Loading…
Reference in New Issue