summaryrefslogtreecommitdiff
path: root/packages/ixp425-eth
diff options
context:
space:
mode:
Diffstat (limited to 'packages/ixp425-eth')
-rw-r--r--packages/ixp425-eth/ixp400-eth-1.5/2.6.14.patch7
-rw-r--r--packages/ixp425-eth/ixp400-eth-1.5/2.6.15.patch9
-rw-r--r--packages/ixp425-eth/ixp400-eth-1.5/Makefile.patch7
-rw-r--r--packages/ixp425-eth/ixp400-eth-1.5/continue-if-qmgr-init-fails.patch22
-rw-r--r--packages/ixp425-eth/ixp400-eth-1.5/debug.patch96
-rw-r--r--packages/ixp425-eth/ixp400-eth-1.5/device-name.patch53
-rw-r--r--packages/ixp425-eth/ixp400-eth-1.5/int-random.patch16
-rw-r--r--packages/ixp425-eth/ixp400-eth-1.5/le.patch15
-rw-r--r--packages/ixp425-eth/ixp400-eth-1.5/mac-address.patch4
-rw-r--r--packages/ixp425-eth/ixp400-eth-1.5/poll-controller.patch15
-rw-r--r--packages/ixp425-eth/ixp400-eth-1.5/stop-on-rmmod.patch29
-rw-r--r--packages/ixp425-eth/ixp400-eth_1.5.bb7
12 files changed, 242 insertions, 38 deletions
diff --git a/packages/ixp425-eth/ixp400-eth-1.5/2.6.14.patch b/packages/ixp425-eth/ixp400-eth-1.5/2.6.14.patch
index 9d8dcc6590..f3426e4287 100644
--- a/packages/ixp425-eth/ixp400-eth-1.5/2.6.14.patch
+++ b/packages/ixp425-eth/ixp400-eth-1.5/2.6.14.patch
@@ -1,5 +1,8 @@
---- ./ixp400_eth.c 2005-11-19 23:27:54.541565744 -0800
-+++ ./ixp400_eth.c 2005-11-19 23:28:56.253449028 -0800
+ ixp400_eth.c | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+--- ixp400-eth/ixp400_eth.c 1970-01-01 00:00:00.000000000 +0000
++++ ixp400-eth/ixp400_eth.c 1970-01-01 00:00:00.000000000 +0000
@@ -1838,7 +1838,11 @@ static inline void dev_eth_type_trans(un
skb->len -= header_len;
diff --git a/packages/ixp425-eth/ixp400-eth-1.5/2.6.15.patch b/packages/ixp425-eth/ixp400-eth-1.5/2.6.15.patch
index 143c509c62..83115d8efa 100644
--- a/packages/ixp425-eth/ixp400-eth-1.5/2.6.15.patch
+++ b/packages/ixp425-eth/ixp400-eth-1.5/2.6.15.patch
@@ -1,5 +1,10 @@
---- ./ixp400_eth.c.orig 2005-11-13 16:17:57.943717806 -0800
-+++ ./ixp400_eth.c 2005-11-13 16:29:00.829430574 -0800
+2.6.15 needs platform_device.h
+
+ ixp400_eth.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+--- ixp400-eth/ixp400_eth.c 1970-01-01 00:00:00.000000000 +0000
++++ ixp400-eth/ixp400_eth.c 1970-01-01 00:00:00.000000000 +0000
@@ -65,6 +65,10 @@
#include <linux/sysctl.h>
#include <linux/unistd.h>
diff --git a/packages/ixp425-eth/ixp400-eth-1.5/Makefile.patch b/packages/ixp425-eth/ixp400-eth-1.5/Makefile.patch
index 2120391cbb..3bc51f0b66 100644
--- a/packages/ixp425-eth/ixp400-eth-1.5/Makefile.patch
+++ b/packages/ixp425-eth/ixp400-eth-1.5/Makefile.patch
@@ -1,5 +1,8 @@
---- ./Makefile 2005-09-06 00:17:15.000000000 -0700
-+++ ./Makefile 2005-10-02 22:15:19.974595551 -0700
+This is an OpenEmbedded only patch to make the code buildable in
+the OpenEmbedded environment.
+
+--- ixp400-eth/Makefile 1970-01-01 00:00:00.000000000 +0000
++++ ixp400-eth/Makefile 1970-01-01 00:00:00.000000000 +0000
@@ -0,0 +1,30 @@
+obj-m := ixp400_eth.o
+
diff --git a/packages/ixp425-eth/ixp400-eth-1.5/continue-if-qmgr-init-fails.patch b/packages/ixp425-eth/ixp400-eth-1.5/continue-if-qmgr-init-fails.patch
new file mode 100644
index 0000000000..8508790fa5
--- /dev/null
+++ b/packages/ixp425-eth/ixp400-eth-1.5/continue-if-qmgr-init-fails.patch
@@ -0,0 +1,22 @@
+tries to go on even if queue manager initialization
+fails. this is hand because you'll be allowed to
+insert ixp400_eth immediately after you have removed
+it, without re-inserting ixp400.
+
+ ixp400_eth.c | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+--- ixp400-eth/ixp400_eth.c 1970-01-01 00:00:00.000000000 +0000
++++ ixp400-eth/ixp400_eth.c 1970-01-01 00:00:00.000000000 +0000
+@@ -2850,10 +2850,7 @@ static int qmgr_init(void)
+ /* Initialise Queue Manager */
+ P_VERBOSE("Initialising Queue Manager...\n");
+ if ((res = ixQMgrInit()))
+- {
+- P_ERROR("Error initialising queue manager!\n");
+- return -1;
+- }
++ P_ERROR("Error initialising queue manager, trying to continue!\n");
+
+ TRACE;
+
diff --git a/packages/ixp425-eth/ixp400-eth-1.5/debug.patch b/packages/ixp425-eth/ixp400-eth-1.5/debug.patch
index f88457c060..c684c078d2 100644
--- a/packages/ixp425-eth/ixp400-eth-1.5/debug.patch
+++ b/packages/ixp425-eth/ixp400-eth-1.5/debug.patch
@@ -1,7 +1,62 @@
-# This patch is not necessary but helps when debugging the build
---- ./ixp400_eth.c 2005-11-20 13:26:14.890767165 -0800
-+++ ./ixp400_eth.c 2005-11-20 13:45:32.163589752 -0800
-@@ -3249,6 +3249,8 @@ static int __devinit dev_eth_probe(struc
+This patch is not necessary but helps when debugging the build
+
+--- ixp400-eth/ixp400_eth.c 1970-01-01 00:00:00.000000000 +0000
++++ ixp400-eth/ixp400_eth.c 1970-01-01 00:00:00.000000000 +0000
+@@ -1350,9 +1350,10 @@ static int dev_media_check_thread (void*
+
+ if (res != IX_ETH_ACC_SUCCESS)
+ {
+- P_WARN("ixEthMiiLinkStatus failed on PHY%d.\n"
++ P_WARN("%s: ixEthMiiLinkStatus failed on PHY%d.\n"
+ "\tCan't determine\nthe auto negotiated parameters. "
+ "Using default values.\n",
++ dev->name,
+ phyNum);
+ /* something is bad, gracefully stops the loop */
+ priv->maintenanceCheckStopped = TRUE;
+@@ -2213,7 +2214,8 @@ static int port_enable(struct net_device
+ IX_IEEE803_MAC_ADDRESS_SIZE);
+ if ((res = ixEthAccPortUnicastMacAddressSet(priv->port_id, &npeMacAddr)))
+ {
+- P_VERBOSE("Failed to set MAC address %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x for port %d\n",
++ P_VERBOSE("%s: Failed to set MAC address %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x for port %d\n",
++ dev->name,
+ (unsigned)npeMacAddr.macAddress[0],
+ (unsigned)npeMacAddr.macAddress[1],
+ (unsigned)npeMacAddr.macAddress[2],
+@@ -2707,8 +2709,8 @@ static int do_dev_ioctl(struct net_devic
+ down (miiAccessMutex); /* lock the MII register access mutex */
+ if ((res = ixEthAccMiiReadRtn (data->phy_id, data->reg_num, &data->val_out)))
+ {
+- P_ERROR("Error reading MII reg %d on phy %d\n",
+- data->reg_num, data->phy_id);
++ P_ERROR("%s: Error reading MII reg %d on phy %d\n",
++ dev->name, data->reg_num, data->phy_id);
+ res = -1;
+ }
+ up (miiAccessMutex); /* release the MII register access mutex */
+@@ -2720,8 +2722,8 @@ static int do_dev_ioctl(struct net_devic
+ down (miiAccessMutex); /* lock the MII register access mutex */
+ if ((res = ixEthAccMiiWriteRtn (data->phy_id, data->reg_num, data->val_in)))
+ {
+- P_ERROR("Error writing MII reg %d on phy %d\n",
+- data->reg_num, data->phy_id);
++ P_ERROR("%s: Error writing MII reg %d on phy %d\n",
++ dev->name, data->reg_num, data->phy_id);
+ res = -1;
+ }
+ up (miiAccessMutex); /* release the MII register access mutex */
+@@ -3049,7 +3051,8 @@ static int set_mac_address(struct net_de
+ /* Set MAC addr in h/w (ethAcc checks for MAC address to be valid) */
+ if ((res = ixEthAccPortUnicastMacAddressSet(priv->port_id, &npeMacAddr)))
+ {
+- P_VERBOSE("Failed to set MAC address %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x for port %d\n",
++ P_VERBOSE("%s: Failed to set MAC address %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x for port %d\n",
++ dev->name,
+ (unsigned)npeMacAddr.macAddress[0],
+ (unsigned)npeMacAddr.macAddress[1],
+ (unsigned)npeMacAddr.macAddress[2],
+@@ -3267,6 +3270,8 @@ static int __devinit dev_eth_probe(struc
kmalloc(sizeof(struct semaphore), GFP_KERNEL);
if (!priv->maintenanceCheckThreadComplete)
{
@@ -10,7 +65,7 @@
goto error;
}
priv->lock = SPIN_LOCK_UNLOCKED;
-@@ -3355,7 +3361,11 @@ static int __devinit dev_eth_probe(struc
+@@ -3360,7 +3365,11 @@ static int __devinit dev_eth_probe(struc
#if IS_KERNEL26
if (register_netdev(ndev))
@@ -22,7 +77,7 @@
#else
found_devices++;
#endif /* IS_KERNEL26 */
-@@ -3365,6 +3375,8 @@ static int __devinit dev_eth_probe(struc
+@@ -3370,6 +3379,8 @@ static int __devinit dev_eth_probe(struc
/* register EthAcc callbacks for this port */
if (dev_rxtxcallback_register(portId, (UINT32)ndev))
{
@@ -31,7 +86,7 @@
goto error;
}
-@@ -3388,6 +3400,7 @@ static int __devinit dev_eth_probe(struc
+@@ -3393,6 +3404,7 @@ static int __devinit dev_eth_probe(struc
/* Error handling: enter here whenever error detected */
error:
@@ -39,7 +94,32 @@
TRACE;
#ifdef CONFIG_IXP400_ETH_QDISC_ENABLED
-@@ -3523,6 +3536,9 @@ static int __init ixp400_eth_init(void)
+@@ -3465,21 +3477,21 @@ static int __devexit dev_eth_remove(int
+ {
+ if (IX_SUCCESS != ixNpeDlNpeStopAndReset(IX_NPEDL_NPEID_NPEA))
+ {
+- P_NOTICE("Error Halting NPE for Ethernet port %d!\n", portId);
++ P_NOTICE("%s: Error Halting NPE for Ethernet port %d!\n", ndev->name, portId);
+ }
+ }
+ if (default_npeImageId[portId] == IX_ETH_NPE_B_IMAGE_ID)
+ {
+ if (IX_SUCCESS != ixNpeDlNpeStopAndReset(IX_NPEDL_NPEID_NPEB))
+ {
+- P_NOTICE("Error Halting NPE for Ethernet port %d!\n", portId);
++ P_NOTICE("%s: Error Halting NPE for Ethernet port %d!\n", ndev->name, portId);
+ }
+ }
+ if (default_npeImageId[portId] == IX_ETH_NPE_C_IMAGE_ID)
+ {
+ if (IX_SUCCESS != ixNpeDlNpeStopAndReset(IX_NPEDL_NPEID_NPEC))
+ {
+- P_NOTICE("Error Halting NPE for Ethernet port %d!\n", portId);
++ P_NOTICE("%s: Error Halting NPE for Ethernet port %d!\n", ndev->name, portId);
+ }
+ }
+
+@@ -3528,6 +3540,9 @@ static int __init ixp400_eth_init(void)
TRACE;
P_INFO("Initializing IXP400 NPE Ethernet driver software v. " MOD_VERSION " \n");
diff --git a/packages/ixp425-eth/ixp400-eth-1.5/device-name.patch b/packages/ixp425-eth/ixp400-eth-1.5/device-name.patch
index b0e0d329e6..d8bbc97b8c 100644
--- a/packages/ixp425-eth/ixp400-eth-1.5/device-name.patch
+++ b/packages/ixp425-eth/ixp400-eth-1.5/device-name.patch
@@ -1,14 +1,47 @@
---- ./ixp400_eth.c 2005-11-20 16:58:48.973330982 -0800
-+++ ./ixp400_eth.c 2005-11-20 17:01:26.719257307 -0800
-@@ -161,7 +161,11 @@ MODULE_PARM(dev_max_count, "i");
+ register the ethernet devices as ethX
+
+ ixp400_eth.c | 41 +++++++++++++++++++----------------------
+ 1 file changed, 19 insertions(+), 22 deletions(-)
+
+--- ixp400-eth/ixp400_eth.c 1970-01-01 00:00:00.000000000 +0000
++++ ixp400-eth/ixp400_eth.c 1970-01-01 00:00:00.000000000 +0000
+@@ -160,9 +160,6 @@ MODULE_PARM_DESC(phy_reset, "If non-zero
+ MODULE_PARM(dev_max_count, "i");
MODULE_PARM_DESC(dev_max_count, "Number of devices to initialize");
- /* devices will be called ixp0 and ixp1 */
-+#ifdef IX_DEVICE_NAME_ETH
-+#define DEVICE_NAME "eth"
-+#else
- #define DEVICE_NAME "ixp"
-+#endif
-
+-/* devices will be called ixp0 and ixp1 */
+-#define DEVICE_NAME "ixp"
+-
/* boolean values for PHY link speed, duplex, and autonegotiation */
#define PHY_SPEED_10 0
+ #define PHY_SPEED_100 1
+@@ -1570,7 +1568,7 @@ static int dev_pmu_timer_setup(void)
+ if (request_irq(IX_OSAL_IXP400_XSCALE_PMU_IRQ_LVL,
+ dev_pmu_timer_os_isr,
+ SA_SHIRQ,
+- DEVICE_NAME,
++ MODULE_NAME,
+ (void *)IRQ_ANY_PARAMETER))
+ {
+ P_ERROR("Failed to reassign irq to PMU timer interrupt!\n");
+@@ -3009,8 +3008,8 @@ static int phy_init(void)
+ if (port_id == IX_ETH_PORT_2) npe_id = "C";
+ if (port_id == IX_ETH_PORT_3) npe_id = "A";
+
+- P_INFO("%s%d is using NPE%s and the PHY at address %d\n",
+- DEVICE_NAME, dev_count, npe_id, phyAddresses[port_id]);
++ P_INFO("ethernet %d using NPE%s and the PHY at address %d\n",
++ dev_count, npe_id, phyAddresses[port_id]);
+
+ /* Set the MAC to the same duplex mode as the phy */
+ ixEthAccPortDuplexModeSet(port_id,
+@@ -3215,9 +3215,6 @@ static int __devinit dev_eth_probe(struc
+ /* set the private port ID */
+ priv->port_id = portId;
+
+- /* set device name */
+- sprintf(ndev->name, DEVICE_NAME"%d", priv->port_id);
+-
+ TRACE;
+
+ /* initialize RX pool */
diff --git a/packages/ixp425-eth/ixp400-eth-1.5/int-random.patch b/packages/ixp425-eth/ixp400-eth-1.5/int-random.patch
new file mode 100644
index 0000000000..fede9daf90
--- /dev/null
+++ b/packages/ixp425-eth/ixp400-eth-1.5/int-random.patch
@@ -0,0 +1,16 @@
+use the ethernet device interrupts to gather entropy
+
+ ixp400_eth.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+--- ixp400-eth/ixp400_eth.c 1970-01-01 00:00:00.000000000 +0000
++++ ixp400-eth/ixp400_eth.c 1970-01-01 00:00:00.000000000 +0000
+@@ -2864,7 +2864,7 @@ static int qmgr_init(void)
+
+ if (request_irq(IX_OSAL_IXP400_QM1_IRQ_LVL,
+ dev_qmgr_os_isr,
+- SA_SHIRQ,
++ SA_SHIRQ | SA_SAMPLE_RANDOM,
+ MODULE_NAME,
+ (void *)IRQ_ANY_PARAMETER))
+ {
diff --git a/packages/ixp425-eth/ixp400-eth-1.5/le.patch b/packages/ixp425-eth/ixp400-eth-1.5/le.patch
index 37c4150bc9..3d569015e6 100644
--- a/packages/ixp425-eth/ixp400-eth-1.5/le.patch
+++ b/packages/ixp425-eth/ixp400-eth-1.5/le.patch
@@ -1,6 +1,11 @@
---- ./ixp400_eth.c 2005-11-20 18:25:26.812410374 -0800
-+++ ./ixp400_eth.c 2005-11-20 18:50:22.126504557 -0800
-@@ -2046,6 +2046,16 @@ static void rx_cb(UINT32 callbackTag, IX
+little endian support
+
+ ixp400_eth.c | 20 ++++++++++++++++++++
+ 1 file changed, 20 insertions(+)
+
+--- ixp400-eth/ixp400_eth.c 1970-01-01 00:00:00.000000000 +0000
++++ ixp400-eth/ixp400_eth.c 1970-01-01 00:00:00.000000000 +0000
+@@ -2040,6 +2040,16 @@ static void rx_cb(UINT32 callbackTag, IX
skb->tail = skb->data + len;
skb->len = len;
@@ -13,11 +18,11 @@
+ *p = ntohl(*p), ++p;
+ }
+#endif
-+
++
#ifdef DEBUG_DUMP
skb_dump("rx", skb);
#endif
-@@ -2436,6 +2446,16 @@ static int dev_hard_start_xmit(struct sk
+@@ -2431,6 +2441,16 @@ static int dev_hard_start_xmit(struct sk
return 0;
}
diff --git a/packages/ixp425-eth/ixp400-eth-1.5/mac-address.patch b/packages/ixp425-eth/ixp400-eth-1.5/mac-address.patch
index bd16124e94..1845dd3089 100644
--- a/packages/ixp425-eth/ixp400-eth-1.5/mac-address.patch
+++ b/packages/ixp425-eth/ixp400-eth-1.5/mac-address.patch
@@ -1,5 +1,5 @@
---- ./ixp400_eth.c.base 2005-11-28 23:59:34.476404165 -0800
-+++ ./ixp400_eth.c 2005-11-29 00:42:44.587389574 -0800
+--- ixp400-eth/ixp400_eth.c 1970-01-01 00:00:00.000000000 +0000
++++ ixp400-eth/ixp400_eth.c 1970-01-01 00:00:00.000000000 +0000
@@ -23,10 +23,10 @@
* This driver is written and optimized for Intel Xscale technology.
*
diff --git a/packages/ixp425-eth/ixp400-eth-1.5/poll-controller.patch b/packages/ixp425-eth/ixp400-eth-1.5/poll-controller.patch
index 22049c3491..64fb310ee5 100644
--- a/packages/ixp425-eth/ixp400-eth-1.5/poll-controller.patch
+++ b/packages/ixp425-eth/ixp400-eth-1.5/poll-controller.patch
@@ -1,6 +1,11 @@
---- ./ixp400_eth.c 2005-11-19 23:36:44.482912850 -0800
-+++ ./ixp400_eth.c 2005-11-19 23:39:13.080263492 -0800
-@@ -347,6 +347,12 @@ static int dev_pmu_timer_init(void);
+poll controller support
+
+ ixp400_eth.c | 22 ++++++++++++++++++++++
+ 1 file changed, 22 insertions(+)
+
+--- ixp400-eth/ixp400_eth.c 1970-01-01 00:00:00.000000000 +0000
++++ ixp400-eth/ixp400_eth.c 1970-01-01 00:00:00.000000000 +0000
+@@ -348,6 +348,12 @@ static int dev_pmu_timer_init(void);
extern void
ixEthTxFrameDoneQMCallback(IxQMgrQId qId, IxQMgrCallbackId callbackId);
@@ -13,7 +18,7 @@
/* Private device data */
typedef struct {
spinlock_t lock; /* multicast management lock */
-@@ -3056,6 +3062,19 @@ static int set_mac_address(struct net_de
+@@ -3060,6 +3066,19 @@ static int set_mac_address(struct net_de
return 0;
}
@@ -33,7 +38,7 @@
/*
* TX QDISC
-@@ -3269,6 +3288,9 @@ static int __devinit dev_eth_probe(struc
+@@ -3270,6 +3289,9 @@ static int __devinit dev_eth_probe(struc
ndev->get_stats = dev_get_stats;
ndev->set_multicast_list = dev_set_multicast_list;
ndev->flags |= IFF_MULTICAST;
diff --git a/packages/ixp425-eth/ixp400-eth-1.5/stop-on-rmmod.patch b/packages/ixp425-eth/ixp400-eth-1.5/stop-on-rmmod.patch
new file mode 100644
index 0000000000..2ddc98938a
--- /dev/null
+++ b/packages/ixp425-eth/ixp400-eth-1.5/stop-on-rmmod.patch
@@ -0,0 +1,29 @@
+devices must be explicitely stopped when
+the driver is going do be removed, otherwise
+it will simply hang.
+
+ ixp400_eth.c | 13 ++++++++++---
+ 1 file changed, 10 insertions(+), 3 deletions(-)
+
+--- ixp400-eth/ixp400_eth.c 1970-01-01 00:00:00.000000000 +0000
++++ ixp400-eth/ixp400_eth.c 1970-01-01 00:00:00.000000000 +0000
+@@ -3800,9 +3800,16 @@ void __exit ixp400_eth_exit(void)
+
+ TRACE;
+
+- /* We can only get here when the module use count is 0,
+- * so there's no need to stop devices.
+- */
++ /* stop devices */
++
++#if IS_KERNEL26
++ for (dev_count = 0;
++ dev_count < dev_max_count; /* module parameter */
++ dev_count++)
++ {
++ do_dev_stop(platform_get_drvdata(&ixp400_eth_devices[dev_count]));
++ }
++#endif
+
+ if (no_ixp400_sw_init == 0) /* module parameter */
+ {
diff --git a/packages/ixp425-eth/ixp400-eth_1.5.bb b/packages/ixp425-eth/ixp400-eth_1.5.bb
index 24eb358902..96287fb3d9 100644
--- a/packages/ixp425-eth/ixp400-eth_1.5.bb
+++ b/packages/ixp425-eth/ixp400-eth_1.5.bb
@@ -6,16 +6,19 @@ HOMEPAGE = "http://www.intel.com/design/network/products/npfamily/ixp420.htm"
LICENSE = "GPL"
SRC_URI = "ftp://aiedownload.intel.com/df-support/9519/eng/GPL_ixp400LinuxEthernetDriverPatch-1_5.zip"
-SRC_URI += "file://Makefile.patch;patch=1"
SRC_URI += "file://2.6.14.patch;patch=1"
SRC_URI += "file://2.6.15.patch;patch=1"
SRC_URI += "file://device-name.patch;patch=1"
SRC_URI += "file://poll-controller.patch;patch=1"
SRC_URI += "file://le.patch;patch=1"
SRC_URI += "file://mac-address.patch;patch=1"
+SRC_URI += "file://int-random.patch;patch=1"
+SRC_URI += "file://stop-on-rmmod.patch;patch=1"
+SRC_URI += "file://continue-if-qmgr-init-fails.patch;patch=1"
SRC_URI += "file://debug.patch;patch=1"
+SRC_URI += "file://Makefile.patch;patch=1"
-PR = "r1"
+PR = "r2"
DEPENDS = "ixp4xx-csr"
RDEPENDS = "ixp4xx-csr"