Staging: slicoss: remove unused macros.
Signed-off-by: Colin Pitrat <colin.pit...@gmail.com>
---
 drivers/staging/slicoss/TODO      |   2 -
 drivers/staging/slicoss/slic.h    |  43 ---------------
 drivers/staging/slicoss/slichw.h  | 107 +-------------------------------------
 drivers/staging/slicoss/slicoss.c |  22 ++------
 4 files changed, 6 insertions(+), 168 deletions(-)

diff --git a/drivers/staging/slicoss/TODO b/drivers/staging/slicoss/TODO
index 9019729..7e5dbc7 100644
--- a/drivers/staging/slicoss/TODO
+++ b/drivers/staging/slicoss/TODO
@@ -11,8 +11,6 @@ TODO:
           - without CONFIG_X86_64 confusion
           - do 64 bit correctly
           - don't depend on order of union
-       - get rid of ASSERT(), use BUG() instead but only where necessary
-         looks like most aren't really useful
        - no new SIOCDEVPRIVATE ioctl allowed
        - don't use module_param for configuring interrupt mitigation
          use ethtool instead
diff --git a/drivers/staging/slicoss/slic.h b/drivers/staging/slicoss/slic.h
index cc0afee..7b20a0f 100644
--- a/drivers/staging/slicoss/slic.h
+++ b/drivers/staging/slicoss/slic.h
@@ -54,7 +54,6 @@
 #define GB_RCVUCODE_VERS_DATE  "2006/03/27 15:12:15"
 static u32 OasisRcvUCodeLen = 512;
 static u32 GBRcvUCodeLen = 512;
-#define SECTION_SIZE 65536
 
 #define SLIC_RSPQ_PAGES_GB        10
 #define SLIC_RSPQ_BUFSINPAGE      (PAGE_SIZE / SLIC_RSPBUF_SIZE)
@@ -117,14 +116,7 @@ struct slic_handle {
 };
 
 #define SLIC_HANDLE_FREE        0x0000
-#define SLIC_HANDLE_DATA        0x0001
 #define SLIC_HANDLE_CMD         0x0002
-#define SLIC_HANDLE_CONTEXT     0x0003
-#define SLIC_HANDLE_TEAM        0x0004
-
-#define handle_index        handle.parts.index
-#define handle_bottom       handle.parts.bottombits
-#define handle_token        handle.whole
 
 #define SLIC_HOSTCMD_SIZE    512
 
@@ -173,35 +165,19 @@ struct mcast_address {
 
 #define CARD_DOWN        0x00000000
 #define CARD_UP          0x00000001
-#define CARD_FAIL        0x00000002
-#define CARD_DIAG        0x00000003
-#define CARD_SLEEP       0x00000004
 
 #define ADAPT_DOWN             0x00
 #define ADAPT_UP               0x01
-#define ADAPT_FAIL             0x02
-#define ADAPT_RESET            0x03
-#define ADAPT_SLEEP            0x04
 
-#define ADAPT_FLAGS_BOOTTIME            0x0001
-#define ADAPT_FLAGS_IS64BIT             0x0002
-#define ADAPT_FLAGS_PENDINGLINKDOWN     0x0004
 #define ADAPT_FLAGS_FIBERMEDIA          0x0008
-#define ADAPT_FLAGS_LOCKS_ALLOCED       0x0010
-#define ADAPT_FLAGS_INT_REGISTERED      0x0020
-#define ADAPT_FLAGS_LOAD_TIMER_SET      0x0040
-#define ADAPT_FLAGS_STATS_TIMER_SET     0x0080
-#define ADAPT_FLAGS_RESET_TIMER_SET     0x0100
 
 #define LINK_DOWN              0x00
-#define LINK_CONFIG            0x01
 #define LINK_UP                0x02
 
 #define LINK_10MB              0x00
 #define LINK_100MB             0x01
 #define LINK_AUTOSPEED         0x02
 #define LINK_1000MB            0x03
-#define LINK_10000MB           0x04
 
 #define LINK_HALFD             0x00
 #define LINK_FULLD             0x01
@@ -214,9 +190,6 @@ struct mcast_address {
 #define MAC_LOOPBACK     0x00000010
 #define MAC_ALLMCAST     0x00000020
 
-#define SLIC_DUPLEX(x)    ((x == LINK_FULLD) ? "FDX" : "HDX")
-#define SLIC_SPEED(x)     ((x == LINK_100MB) ? "100Mb" : ((x == LINK_1000MB) ?\
-                               "1000Mb" : " 10Mb"))
 #define SLIC_LINKSTATE(x) ((x == LINK_DOWN) ? "Down" : "Up  ")
 #define SLIC_ADAPTER_STATE(x) ((x == ADAPT_UP) ? "UP" : "Down")
 #define SLIC_CARD_STATE(x)    ((x == CARD_UP) ? "UP" : "Down")
@@ -254,8 +227,6 @@ struct slicnet_stats {
 };
 
 #define SLIC_LOADTIMER_PERIOD     1
-#define SLIC_INTAGG_DEFAULT       200
-#define SLIC_LOAD_0               0
 #define SLIC_INTAGG_0             0
 #define SLIC_LOAD_1               8000
 #define SLIC_LOAD_2               10000
@@ -267,16 +238,6 @@ struct slicnet_stats {
 #define SLIC_INTAGG_3             150
 #define SLIC_INTAGG_4             200
 #define SLIC_INTAGG_5             250
-#define SLIC_LOAD_1GB             3000
-#define SLIC_LOAD_2GB             6000
-#define SLIC_LOAD_3GB             12000
-#define SLIC_LOAD_4GB             24000
-#define SLIC_LOAD_5GB             48000
-#define SLIC_INTAGG_1GB           50
-#define SLIC_INTAGG_2GB           75
-#define SLIC_INTAGG_3GB           100
-#define SLIC_INTAGG_4GB           100
-#define SLIC_INTAGG_5GB           100
 
 struct ether_header {
        unsigned char    ether_dhost[6];
@@ -324,10 +285,6 @@ struct sliccard {
        u32             reg_valueh[32];
 };
 
-#define NUM_CFG_SPACES      2
-#define NUM_CFG_REGS        64
-#define NUM_CFG_REG_ULONGS  (NUM_CFG_REGS / sizeof(u32))
-
 struct physcard {
        struct adapter  *adapter[SLIC_MAX_PORTS];
        struct physcard *next;
diff --git a/drivers/staging/slicoss/slichw.h b/drivers/staging/slicoss/slichw.h
index 9723b4a..d832dbd 100644
--- a/drivers/staging/slicoss/slichw.h
+++ b/drivers/staging/slicoss/slichw.h
@@ -96,7 +96,6 @@
 #define VRHSTATB_IPLERR                0x00020000
 #define VRHSTATB_IPHERR                0x00010000
 #define SLIC_MAX64_BCNT                23
-#define SLIC_MAX32_BCNT                26
 #define IHCMD_XMT_REQ          0x01
 #define IHFLG_IFSHFT           2
 #define SLIC_RSPBUF_SIZE       32
@@ -116,17 +115,14 @@
 #define ISR_UPCERR             0x01000000
 #define ISR_XDROP              0x00800000
 #define ISR_UPCBSY             0x00020000
-#define ISR_EVMSK              0xffff0000
 #define ISR_PINGMASK           0x00700000
 #define ISR_PINGDSMASK         0x00710000
-#define ISR_UPCMASK            0x11000000
 #define SLIC_WCS_START         0x80000000
 #define SLIC_WCS_COMPARE       0x40000000
 #define SLIC_RCVWCS_BEGIN      0x40000000
 #define SLIC_RCVWCS_FINISH     0x80000000
 #define SLIC_PM_MAXPATTERNS    6
 #define SLIC_PM_PATTERNSIZE    128
-#define SLIC_PMCAPS_WAKEONLAN  0x00000001
 #define MIICR_REG_PCR          0x00000000
 #define MIICR_REG_4            0x00040000
 #define MIICR_REG_9            0x00090000
@@ -138,7 +134,6 @@
 #define PCR_AUTONEG            0x1000
 #define PCR_AUTONEG_RST                0x0200
 #define PCR_DUPLEX_FULL                0x0100
-#define PSR_LINKUP             0x0004
 
 #define PAR_ADV100FD           0x0100
 #define PAR_ADV100HD           0x0080
@@ -148,41 +143,17 @@
 #define PAR_802_3              0x0001
 
 #define PAR_ADV1000XFD         0x0020
-#define PAR_ADV1000XHD         0x0040
 #define PAR_ASYMPAUSE_FIBER    0x0180
 
 #define PGC_ADV1000FD          0x0200
-#define PGC_ADV1000HD          0x0100
-#define SEEQ_LINKFAIL          0x4000
-#define SEEQ_SPEED             0x0080
-#define SEEQ_DUPLEX            0x0040
-#define TDK_DUPLEX             0x0800
-#define TDK_SPEED              0x0400
 #define MRV_REG16_XOVERON      0x0068
 #define MRV_REG16_XOVEROFF     0x0008
-#define MRV_SPEED_1000         0x8000
-#define MRV_SPEED_100          0x4000
-#define MRV_SPEED_10           0x0000
-#define MRV_FULLDUPLEX         0x2000
-#define MRV_LINKUP             0x0400
 
 #define GIG_LINKUP             0x0001
 #define GIG_FULLDUPLEX         0x0002
-#define GIG_SPEED_MASK         0x000C
 #define GIG_SPEED_1000         0x0008
 #define GIG_SPEED_100          0x0004
-#define GIG_SPEED_10           0x0000
-
-#define MCR_RESET              0x80000000
-#define MCR_CRCEN              0x40000000
-#define MCR_FULLD              0x10000000
-#define MCR_PAD                        0x02000000
-#define MCR_RETRYLATE          0x01000000
-#define MCR_BOL_SHIFT          21
-#define MCR_IPG1_SHIFT         14
-#define MCR_IPG2_SHIFT         7
-#define MCR_IPG3_SHIFT         0
-#define GMCR_RESET             0x80000000
+
 #define GMCR_GBIT              0x20000000
 #define GMCR_FULLD             0x10000000
 #define GMCR_GAPBB_SHIFT       14
@@ -197,7 +168,6 @@
 #define XCR_RESET              0x80000000
 #define XCR_XMTEN              0x40000000
 #define XCR_PAUSEEN            0x20000000
-#define XCR_LOADRNG            0x10000000
 #define RCR_RESET              0x80000000
 #define RCR_RCVEN              0x40000000
 #define RCR_RCVALL             0x20000000
@@ -216,11 +186,7 @@
 #define GRCR_HASHSIZE_SHIFT    17
 #define GRCR_HASHSIZE          14
 
-#define SLIC_EEPROM_ID         0xA5A5
-#define SLIC_SRAM_SIZE2GB      (64 * 1024)
-#define SLIC_SRAM_SIZE1GB      (32 * 1024)
 #define SLIC_HOSTID_DEFAULT    0xFFFF          /* uninitialized hostid */
-#define SLIC_NBR_MACS          4
 
 struct slic_rcvbuf {
        u8 pad1[6];
@@ -295,15 +261,12 @@ struct slic_regs {
 
        u32     slic_icr;       /* Interrupt Control Register */
        u32     pad2;
-#define SLIC_ICR               0x0008
 
        u32     slic_isp;       /* Interrupt status pointer */
        u32     pad1;
-#define SLIC_ISP               0x0010
 
        u32     slic_isr;       /* Interrupt status */
        u32     pad3;
-#define SLIC_ISR               0x0018
 
        u32     slic_hbar;      /* Header buffer address reg */
        u32     pad4;
@@ -312,15 +275,11 @@ struct slic_regs {
         *  7-0 - number of buffers passed
         * Buffers are 256 bytes long on 256-byte boundaries.
         */
-#define SLIC_HBAR              0x0020
-#define SLIC_HBAR_CNT_MSK      0x000000FF
 
        u32     slic_dbar;      /* Data buffer handle & address reg */
        u32     pad5;
 
        /* 4 sets of registers; Buffers are 2K bytes long 2 per 4K page. */
-#define SLIC_DBAR              0x0028
-#define SLIC_DBAR_SIZE         2048
 
        u32     slic_cbar;      /* Xmt Cmd buf addr regs.*/
        /*
@@ -329,14 +288,9 @@ struct slic_regs {
         *  4-0 - length of cmd in multiples of 32 bytes
         * Buffers are 32 bytes up to 512 bytes long
         */
-#define SLIC_CBAR              0x0030
-#define SLIC_CBAR_LEN_MSK      0x0000001F
-#define SLIC_CBAR_ALIGN                0x00000020
 
        u32     slic_wcs;       /* write control store*/
 #define        SLIC_WCS                0x0034
-#define SLIC_WCS_START         0x80000000      /*Start the SLIC (Jump to WCS)*/
-#define SLIC_WCS_COMPARE       0x40000000      /* Compare with value in WCS*/
 
        u32     slic_rbar;      /* Response buffer address reg.*/
        u32     pad7;
@@ -345,33 +299,24 @@ struct slic_regs {
         * 7-0 - number of buffers passed
         * Buffers are 32 bytes long on 32-byte boundaries.
         */
-#define SLIC_RBAR              0x0038
-#define SLIC_RBAR_CNT_MSK      0x000000FF
-#define SLIC_RBAR_SIZE         32
 
        u32     slic_stats;     /* read statistics (UPR) */
        u32     pad8;
-#define        SLIC_RSTAT              0x0040
 
        u32     slic_rlsr;      /* read link status */
        u32     pad9;
-#define SLIC_LSTAT             0x0048
 
        u32     slic_wmcfg;     /* Write Mac Config */
        u32     pad10;
-#define        SLIC_WMCFG              0x0050
 
        u32     slic_wphy;      /* Write phy register */
        u32     pad11;
-#define SLIC_WPHY              0x0058
 
        u32     slic_rcbar;     /* Rcv Cmd buf addr reg */
        u32     pad12;
-#define        SLIC_RCBAR              0x0060
 
        u32     slic_rconfig;   /* Read SLIC Config*/
        u32     pad13;
-#define SLIC_RCONFIG   0x0068
 
        u32     slic_intagg;    /* Interrupt aggregation time */
        u32     pad14;
@@ -379,117 +324,88 @@ struct slic_regs {
 
        u32     slic_wxcfg;     /* Write XMIT config reg*/
        u32     pad16;
-#define        SLIC_WXCFG              0x0078
 
        u32     slic_wrcfg;     /* Write RCV config reg*/
        u32     pad17;
-#define        SLIC_WRCFG              0x0080
 
        u32     slic_wraddral;  /* Write rcv addr a low*/
        u32     pad18;
-#define        SLIC_WRADDRAL   0x0088
 
        u32     slic_wraddrah;  /* Write rcv addr a high*/
        u32     pad19;
-#define        SLIC_WRADDRAH   0x0090
 
        u32     slic_wraddrbl;  /* Write rcv addr b low*/
        u32     pad20;
-#define        SLIC_WRADDRBL   0x0098
 
        u32     slic_wraddrbh;  /* Write rcv addr b high*/
        u32             pad21;
-#define        SLIC_WRADDRBH   0x00a0
 
        u32     slic_mcastlow;  /* Low bits of mcast mask*/
        u32             pad22;
-#define        SLIC_MCASTLOW   0x00a8
 
        u32     slic_mcasthigh; /* High bits of mcast mask*/
        u32             pad23;
-#define        SLIC_MCASTHIGH  0x00b0
 
        u32     slic_ping;      /* Ping the card*/
        u32     pad24;
-#define SLIC_PING              0x00b8
 
        u32     slic_dump_cmd;  /* Dump command */
        u32     pad25;
-#define SLIC_DUMP_CMD  0x00c0
 
        u32     slic_dump_data; /* Dump data pointer */
        u32     pad26;
-#define SLIC_DUMP_DATA 0x00c8
 
        u32     slic_pcistatus; /* Read card's pci_status register */
        u32     pad27;
-#define        SLIC_PCISTATUS  0x00d0
 
        u32     slic_wrhostid;  /* Write hostid field */
        u32             pad28;
-#define SLIC_WRHOSTID           0x00d8
 #define SLIC_RDHOSTID_1GB       0x1554
 #define SLIC_RDHOSTID_2GB       0x1554
 
        u32     slic_low_power; /* Put card in a low power state */
        u32     pad29;
-#define SLIC_LOW_POWER 0x00e0
 
        u32     slic_quiesce;   /* force slic into quiescent state
                                 * before soft reset
                                 */
        u32     pad30;
-#define SLIC_QUIESCE   0x00e8
 
        u32     slic_reset_iface;/* reset interface queues */
        u32     pad31;
-#define SLIC_RESET_IFACE 0x00f0
 
        u32     slic_addr_upper;/* Bits 63-32 for host i/f addrs */
        u32     pad32;
-#define SLIC_ADDR_UPPER        0x00f8 /*Register is only written when it has 
changed*/
 
        u32     slic_hbar64;    /* 64 bit Header buffer address reg */
        u32     pad33;
-#define SLIC_HBAR64            0x0100
 
        u32     slic_dbar64;    /* 64 bit Data buffer handle & address reg */
        u32     pad34;
-#define SLIC_DBAR64            0x0108
 
        u32     slic_cbar64;    /* 64 bit Xmt Cmd buf addr regs. */
        u32     pad35;
-#define SLIC_CBAR64            0x0110
 
        u32     slic_rbar64;    /* 64 bit Response buffer address reg.*/
        u32     pad36;
-#define SLIC_RBAR64            0x0118
 
        u32     slic_rcbar64;   /* 64 bit Rcv Cmd buf addr reg*/
        u32     pad37;
-#define        SLIC_RCBAR64    0x0120
 
        u32     slic_stats64;   /* read statistics (64 bit UPR) */
        u32     pad38;
-#define        SLIC_RSTAT64    0x0128
 
        u32     slic_rcv_wcs;   /*Download Gigabit RCV sequencer ucode*/
        u32     pad39;
-#define SLIC_RCV_WCS   0x0130
-#define SLIC_RCVWCS_BEGIN      0x40000000
-#define SLIC_RCVWCS_FINISH     0x80000000
 
        u32     slic_wrvlanid;  /* Write VlanId field */
        u32     pad40;
-#define SLIC_WRVLANID  0x0138
 
        u32     slic_read_xf_info;      /* Read Transformer info */
        u32     pad41;
-#define SLIC_READ_XF_INFO      0x0140
 
        u32     slic_write_xf_info;     /* Write Transformer info */
        u32     pad42;
-#define SLIC_WRITE_XF_INFO     0x0148
 
        u32     RSVD1;          /* TOE Only */
        u32     pad43;
@@ -505,7 +421,6 @@ struct slic_regs {
 
        u32     slic_ticks_per_sec; /* Write card ticks per second */
        u32     pad47;
-#define SLIC_TICKS_PER_SEC     0x0170
 };
 
 enum UPR_REQUEST {
@@ -616,19 +531,6 @@ struct slic_stats {
        } u;
 };
 
-#define xmit_tcp_segs100               u.stats_100.xmt100.xmit_tcp_segs
-#define xmit_tcp_bytes100              u.stats_100.xmt100.xmit_tcp_bytes
-#define xmit_bytes100                  u.stats_100.xmt100.xmit_bytes
-#define xmit_collisions100             u.stats_100.xmt100.xmit_collisions
-#define xmit_unicasts100               u.stats_100.xmt100.xmit_unicasts
-#define xmit_other_error100            u.stats_100.xmt100.xmit_other_error
-#define xmit_excess_collisions100      
u.stats_100.xmt100.xmit_excess_collisions
-#define rcv_tcp_segs100                        u.stats_100.rcv100.rcv_tcp_segs
-#define rcv_tcp_bytes100               u.stats_100.rcv100.rcv_tcp_bytes
-#define rcv_bytes100                   u.stats_100.rcv100.rcv_bytes
-#define rcv_unicasts100                        u.stats_100.rcv100.rcv_unicasts
-#define rcv_other_error100             u.stats_100.rcv100.rcv_other_error
-#define rcv_drops100                   u.stats_100.rcv100.rcv_drops
 #define xmit_tcp_segs_gb               u.stats_GB.xmtGB.xmit_tcp_segs
 #define xmit_tcp_bytes_gb              u.stats_GB.xmtGB.xmit_tcp_bytes
 #define xmit_bytes_gb                  u.stats_GB.xmtGB.xmit_bytes
@@ -648,13 +550,6 @@ struct slic_config_mac {
        u8 macaddrA[6];
 };
 
-#define ATK_FRU_FORMAT         0x00
-#define VENDOR1_FRU_FORMAT     0x01
-#define VENDOR2_FRU_FORMAT     0x02
-#define VENDOR3_FRU_FORMAT     0x03
-#define VENDOR4_FRU_FORMAT     0x04
-#define NO_FRU_FORMAT          0xFF
-
 struct atk_fru {
        u8 assembly[6];
        u8 revision[2];
diff --git a/drivers/staging/slicoss/slicoss.c 
b/drivers/staging/slicoss/slicoss.c
index 6d50fc4..a33eca0 100644
--- a/drivers/staging/slicoss/slicoss.c
+++ b/drivers/staging/slicoss/slicoss.c
@@ -55,13 +55,9 @@
  */
 
 #define KLUDGE_FOR_4GB_BOUNDARY         1
-#define DEBUG_MICROCODE                 1
-#define DBG                             1
 #define SLIC_INTERRUPT_PROCESS_LIMIT   1
 #define SLIC_OFFLOAD_IP_CHECKSUM       1
-#define STATS_TIMER_INTERVAL           2
 #define PING_TIMER_INTERVAL            1
-#define pr_fmt(fmt) KBUILD_MODNAME ": " fmt
 
 #include <linux/kernel.h>
 #include <linux/string.h>
@@ -102,17 +98,12 @@ static char *slic_banner = "Alacritech SLIC Technology(tm) 
Server and Storage Ac
 static char *slic_proc_version = "2.0.351  2006/07/14 12:26:00";
 
 static struct base_driver slic_global = { {}, 0, 0, 0, 1, NULL, NULL };
-#define DEFAULT_INTAGG_DELAY 100
 static unsigned int rcv_count;
 
 #define DRV_NAME          "slicoss"
-#define DRV_VERSION       "2.0.1"
 #define DRV_AUTHOR        "Alacritech, Inc. Engineering"
 #define DRV_DESCRIPTION   "Alacritech SLIC Techonology(tm) "\
                "Non-Accelerated Driver"
-#define DRV_COPYRIGHT     "Copyright  2000-2006 Alacritech, Inc. "\
-               "All rights reserved."
-#define PFX               DRV_NAME " "
 
 MODULE_AUTHOR(DRV_AUTHOR);
 MODULE_DESCRIPTION(DRV_DESCRIPTION);
@@ -1339,7 +1330,7 @@ static void slic_cmdq_addcmdpage(struct adapter *adapter, 
u32 *page)
                pslic_handle->next = NULL;
 
                cmd->pslic_handle = pslic_handle;
-               cmd->cmd64.hosthandle = pslic_handle->token.handle_token;
+               cmd->cmd64.hosthandle = pslic_handle->token.handle.whole;
                cmd->busy = false;
                cmd->paddrl = phys_addrl;
                cmd->paddrh = phys_addrh;
@@ -1992,9 +1983,6 @@ static void slic_rcv_handle_error(struct adapter *adapter,
        }
 }
 
-#define TCP_OFFLOAD_FRAME_PUSHFLAG  0x10000000
-#define M_FAST_PATH                 0x0040
-
 static void slic_rcv_handler(struct adapter *adapter)
 {
        struct net_device *netdev = adapter->netdev;
@@ -2059,10 +2047,10 @@ static void slic_xmit_complete(struct adapter *adapter)
                /*
                 * Get the complete host command buffer
                 */
-               slic_handle_word.handle_token = rspbuf->hosthandle;
+               slic_handle_word.handle.whole = rspbuf->hosthandle;
                hcmd =
-                       adapter->slic_handles[slic_handle_word.handle_index].
-                                                                       address;
+                       adapter->slic_handles[
+                               slic_handle_word.handle.parts.index].address;
 /*      hcmd = (struct slic_hostcmd *) rspbuf->hosthandle; */
                if (hcmd->type == SLIC_CMD_DUMB) {
                        if (hcmd->skb)
@@ -2927,7 +2915,7 @@ static void slic_init_adapter(struct net_device *netdev,
        for (index = 1, pslic_handle = &adapter->slic_handles[1];
             index < SLIC_CMDQ_MAXCMDS; index++, pslic_handle++) {
 
-               pslic_handle->token.handle_index = index;
+               pslic_handle->token.handle.parts.index = index;
                pslic_handle->type = SLIC_HANDLE_FREE;
                pslic_handle->next = adapter->pfree_slic_handles;
                adapter->pfree_slic_handles = pslic_handle;
-- 
2.8.0

_______________________________________________
devel mailing list
de...@linuxdriverproject.org
http://driverdev.linuxdriverproject.org/mailman/listinfo/driverdev-devel

Reply via email to