#!/bin/bash


taglin_table_modify ()
{
    local field="$1"
    local value="$2"
    local table_id="$3"
    shift 3

    taglin_table_dump "$table_id" "$@" | sed "/$field/s/:.*/: $value/" | taglin_table_fill "$table_id"
}

taglin_table_clear ()
{
    local table_id="$1"
    shift 1

    taglin_table_dump "$table_id" "$@" | grep ^0 | taglin_table_fill "$table_id"
}

taglin_dump_gen_ram_2048 ()
{
    local id="$1"
    shift 1

    local addr=$((0x1000011000000+0xb00000 + $id * 2048))
    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 2048
}

taglin_dump_gen_ram_256 ()
{
    local id="$1"
    shift 1

    local addr=$((0x1000011000000+0xc00000 + $id * 256))
    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 256
}

taglin_dump_TMR_BLK8_RAM ()
{
    local id="$1"
    shift 1

    local addr=$((0x1000011000000+0x20000 + $id * 64))
    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 64 
}

taglin_dump_TAGLIN_TMR_BLK64_RAM ()
{
    local id="$1"
    shift 1

    local addr=$((0x1000011000000+0x21000 + $id * 64))
    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 64 
}

taglin_dump_TAGLIN_TMR_BLK512_0_RAM ()
{
    local id="$1"
    shift 1

    local addr=$((0x1000011000000+0x30000 + $id * 64))
    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 64 
}

taglin_dump_TAGLIN_TMR_BLK512_1_RAM()
{
    local id="$1"
    shift 1

    local addr=$((0x1000011000000+0x38000 + $id * 64))
    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 64 
}



taglin_dump_idt ()
{
    local addr=$((0x1000011000000+0x2000))
    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 512 4 
}

taglin_dump_rx_seqobj ()
{
    local id="$1"
    shift 1

    local addr=$((0x1000011000000+0x800000 + $id * 192))
    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 24 8 
}

taglin_dump_rx_seqobj_clear ()
{
    local id="$1"
    shift 1

   taglin_dump_rx_seqobj $id

    for i in {0..23}
    do
        local addr=$((0x1000011000000+0x800000 + $id * 192 + $i * 8))
        temp=`printf "0x%x\n" ${addr}`
        mmem -v 0x0 $temp 8
    done

   echo "----------------------------------"
   echo "----------------------------------"

   taglin_dump_rx_seqobj $id

}

taglin_dump_counter ()
{
    local id="$1"
    shift 1

    echo "Rx(frame/byte) Tx(frame/byte)"
    local addr=$((0x1000011000000+0x80000 + ($id << 5)))
    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 4 8 
}


taglin_dump_error_counter ()
{

    echo "CRC (frame/byte) UPD (frame/byte)"
    local addr=$((0x1000011000000+0x100))
    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 4 8 
}

taglin_dump_phy_counter ()
{

    echo "(frame/byte)"
    echo "- 0x0 = Port 19 XFI RX counter (from Triump)"
    echo "- 0x1 = Port 19 XFI TX counter (To Triumph)"
    echo "- 0x2 = Port 20 XFI RX counter (from Triumph)"
    echo "- 0x3 = Port 20 XFI TX counter (To Triumph)"
    echo "- 0x4 = Port 19 SFI RX counter (from SFP/SFP+)"
    echo "- 0x5 = Port 19 SFI TX counter (to SFP/SFP+)"
    echo "- 0x6 = Port 20 SFI RX counter (from SFP/SFP+)"
    echo "- 0x7 = Port 20 SFI TX counter (to SFP/SFP+)"
    echo "- 0x8 = SGMII PHY0 RX counter (from Cavium)"
    echo "- 0x9 = SGMII_PHY0 TX counter (To Cavium)"
    echo "- 0xA = SGMII PHY1 RX counter (from Cavium)"
    echo "- 0xB = SGMII_PHY1 TX counter (To Cavium)"
    echo "- 0xC = SGMII PHY2 RX counter (from Cavium)"
    echo "- 0xD = SGMII_PHY2 TX counter (To Cavium)"
    echo "- 0xE = SGMII PHY3 RX counter (from Triumph)"
    echo "- 0xF = SGMII_PHY3 TX counter (To Triumph)"
    echo "- 0x10 = Rx_Classifier search request counter - inc each time rx_parser serarches classifier"
    echo "- 0x11 = Tx_frame_editor output frame counter - inc each time tfe generates a frame" 
    echo "- 0x12 = Dropped Frame Counters"
    echo "- 0x13 = Classifier to Tx Frame Editor Request counter"
    echo "- 0x14 = Classifier to Rx Frame Processor Request counter" 

    local addr=$((0x1000011000000+0x1800))
    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 42 8 
}

taglin_clear_phy_counter ()
{

   taglinreg TAGLIN_REG_CNTRL.GLOBAL_CLR_ON_RD_EN 1

   local addr=$((0x1000011000000+0x1800))
   local temp=`printf "0x%x\n" ${addr}`
   dmem  $temp 42 8 

   taglinreg TAGLIN_REG_CNTRL.GLOBAL_CLR_ON_RD_EN 0 

}

taglin_dump_rx_frame_counter ()
{
    local id="$1"
    shift 1

    echo "(frame)"
    echo "--4'h0 = Unknown Frame type"
    echo "- 4'h1 = UDP Frame"
    echo "- 4'h2 = DMM Frame"
    echo "- 4'h3 = DMR Frame"
    echo "- 4'h4 = LBM Frame"
    echo "- 4'h5 = LBR Frame"
    echo "- 4'h6 = IPV4 Frame"
    echo "- 4'h7-8 = unused"
    echo "- 4'h9 = Y1731 Test Frame"
    echo "- 4'ha = Non-IP Frame"
    echo "- 4'hb-F = unused"

    local addr=$((0x1000011000000+0x8000 + ($id << 7)))
    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 16 8 

}


taglin_clear_rx_frame_counter ()
{
    local id="$1"
    shift 1

    taglinreg TAGLIN_REG_CNTRL.GLOBAL_CLR_ON_RD_EN 1

    local addr=$((0x1000011000000+0x8000 + ($id << 7)))
    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 16 8 

    taglinreg TAGLIN_REG_CNTRL.GLOBAL_CLR_ON_RD_EN 0 

}

taglin_dump_rx_classifer_ram()
{
    local id="$1"
    shift 1

    local addr=$((0x1000011000000+0x100000 + $id * 64))  # (512/8 == 64)
    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 8 8 
}


# Used when you don't have a reflector. 
# Enable remote loopback on the BCM port. 
# s XMAC_CTRL.xe23 LINE_REMOTE_LPBK=1
taglin_swap_da_sa ()
{
   taglinreg TAGLIN_REG_CLASSIFIER_CTRL.DELETE_ENTRY 1

   local a=`taglinreg TAGLIN_REG_ENTRY_DATA1|awk '{print $3}'` 
   local b=`taglinreg TAGLIN_REG_ENTRY_DATA2|awk '{print $3}'`
   local c=`taglinreg TAGLIN_REG_ENTRY_DATA3|awk '{print $3}'`

   local d=`taglinreg TAGLIN_REG_ENTRY_DATA4|awk '{print $3}'`
   local e=`taglinreg TAGLIN_REG_ENTRY_DATA5|awk '{print $3}'`
   local f=`taglinreg TAGLIN_REG_ENTRY_DATA6|awk '{print $3}'`

   taglinreg TAGLIN_REG_ENTRY_DATA1 $d
   taglinreg TAGLIN_REG_ENTRY_DATA2 $e
   taglinreg TAGLIN_REG_ENTRY_DATA3 $f

   taglinreg TAGLIN_REG_ENTRY_DATA4 $a
   taglinreg TAGLIN_REG_ENTRY_DATA5 $b
   taglinreg TAGLIN_REG_ENTRY_DATA6 $c

   taglinreg TAGLIN_REG_CLASSIFIER_CTRL.ADD_ENTRY 0x1
   taglinreg TAGLIN_REG_CLASSIFIER_FILL_LEVEL.
}

taglin_clear_all_count ()
{
    local id="$1"
    shift 1

  taglin_clear_phy_counter
  taglin_clear_rx_frame_counter $id 

  taglinreg TAGLIN_REG_CNTRL.CLEAR_ALL_COUNTERS 1
  taglin_dump_counter 0 
  taglin_dump_counter $id 
  taglin_dump_error_counter

  taglinreg TAGLIN_REG_CNTRL.CLEAR_ALL_COUNTERS 0

  taglin_dump_rx_seqobj_clear $id 

}

taglin_dump_all_count ()
{
    local id="$1"
    shift 1

   echo "----------PHY Counter-----------"
   taglin_dump_phy_counter $id 
   echo "----------Rx Frame Counter-----------"
   taglin_dump_rx_frame_counter $id 

   echo "----------Class Miss-----------"
   taglin_dump_counter 0
   echo "----------Count $id-----------"
   taglin_dump_counter $id 
   echo "----------Error Count-----------"
   taglin_dump_error_counter

   echo "--------rx_seqobj-------------"
   taglin_dump_rx_seqobj $id 


}

taglin_dump_TAGLIN_SEQUENCE_TX_SEQ_NUM()
{
    local id="$1"
    shift 1

    local addr=$((0x1000011000000 + 0x10000 + $id * 4))
    local temp=`printf "0x%x\n" ${addr}`
    dmem  $temp 1 4
}


##2544 Testing:
#3960
taglin_test_setupA ()
{

    local id="$1"
    local count=0
    shift 1

    frame=(03008618ae170200 015a1ed900810800
           000800456a000000 000011ff3e2c12c6
           100112c610020700 07005600bb700000
           0000000000000000 000069436e652061
           4652324334352034 6574747370206361
           656b20742e312e32 2e332e2e69436e65
           2061465232433435 2034657474737020
           6361656b20742e31 2e322e3300000000)


     for item in ${frame[*]}
     do
        local addr=$((0x1000011000000+0xb00000 + $id * 2048 + $count))
        count=$((count+8))
        temp=`printf "0x%x\n" ${addr}`
        mmem -v 0x$item $temp 8 
        echo 0x$item $temp $count
      done


   taglin_table_modify custom_type 0x3 time_gen_10g 1 1
   taglin_table_modify seq_num_offset 0x2e time_gen_10g 1 1
   taglin_table_modify timestamp_offset 0x32 time_gen_10g 1 1
   taglin_table_modify time_stamp_type 0x0 time_gen_10g 1 1
   taglin_table_modify fill_start_pos 0x400 time_gen_10g 1 1
   taglin_table_modify fill_type 0x1 time_gen_10g 1 1
   taglin_table_modify service_id 0x1 time_gen_10g 1 1
   taglin_table_modify frame_length 0x80 time_gen_10g 1 1
   taglin_table_modify bytes_per_second 112500000 time_gen_10g 1 1
   taglin_table_modify use_idt 0x0 time_gen_10g 1 1
   taglin_table_modify frame_count 0xffff time_gen_10g 1 1
   taglin_table_modify udp_checksum_location 0x2c time_gen_10g 1 1
   taglin_table_modify udp_header 0x1 time_gen_10g 1 1
   taglin_table_modify continuous 0x0 time_gen_10g 1 1
   taglin_table_modify valid 0x0 time_gen_10g 1 1


   taglinreg TAGLIN_REG_ENTRY_DATA0  0x0008
   taglinreg TAGLIN_REG_ENTRY_DATA1  0xd91e
   taglinreg TAGLIN_REG_ENTRY_DATA2  0x5a01
   taglinreg TAGLIN_REG_ENTRY_DATA3  0x0002
   taglinreg TAGLIN_REG_ENTRY_DATA4  0x17ae
   taglinreg TAGLIN_REG_ENTRY_DATA5  0x1886
   taglinreg TAGLIN_REG_ENTRY_DATA6  0x0003
   taglinreg TAGLIN_REG_ENTRY_DATA7  0x001e
   taglinreg TAGLIN_REG_ENTRY_DATA8  0x0068
   taglinreg TAGLIN_REG_ENTRY_DATA9  0x0200
   taglinreg TAGLIN_REG_ENTRY_DATA10 0x01e0
   taglinreg TAGLIN_REG_ENTRY_DATA11 0x0000
   taglinreg TAGLIN_REG_ENTRY_DATA12 0x0000
   taglinreg TAGLIN_REG_ENTRY_DATA13 0x0000
   taglinreg TAGLIN_REG_ENTRY_DATA14 0x0000
   taglinreg TAGLIN_REG_ENTRY_DATA15 0x0000
   taglinreg TAGLIN_REG_ENTRY_DATA16 0x0000
   taglinreg TAGLIN_REG_ENTRY_DATA17 0x8e00
   taglinreg TAGLIN_REG_ENTRY_DATA18 0x0000
   taglinreg TAGLIN_REG_ENTRY_DATA19 0x0000
   taglinreg TAGLIN_REG_ENTRY_DATA20 0x0000
   taglinreg TAGLIN_REG_ENTRY_DATA21 0x0000
   taglinreg TAGLIN_REG_ENTRY_DATA22 0x0000
   taglinreg TAGLIN_REG_ENTRY_DATA23 0x0000
   taglinreg TAGLIN_REG_ENTRY_DATA24 0x0000
   taglinreg TAGLIN_REG_ENTRY_DATA25 0x0000
   taglinreg TAGLIN_REG_ENTRY_DATA26 0x0000
   taglinreg TAGLIN_REG_ENTRY_DATA27 0x0000
   taglinreg TAGLIN_REG_ENTRY_DATA28 0x0000
   taglinreg TAGLIN_REG_ENTRY_DATA29 0x0000
   taglinreg TAGLIN_REG_ENTRY_DATA30 0x0000

   taglinreg TAGLIN_REG_CLASSIFIER_CTRL.ADD_ENTRY 0x1
   taglinreg TAGLIN_REG_CLASSIFIER_FILL_LEVEL.
}

#Langwell
taglin_test_setupB ()
{

    local id="$1"
    local count=0
    shift 1

    frame=(0200015aa3dc0200 015abed500810800
           000800456a000000 000011ff3e2c12c6
           100112c610020700 07005600bb700000
           0000000000000000 000069436e652061
           4652324334352034 6574747370206361
           656b20742e312e32 2e332e2e69436e65
           2061465232433435 2034657474737020
           6361656b20742e31 2e322e3300000000)



     for item in ${frame[*]}
     do
        local addr=$((0x1000011000000+0xb00000 + $id * 2048 + $count))
        count=$((count+8))
        temp=`printf "0x%x\n" ${addr}`
        mmem -v 0x$item $temp 8 
        echo 0x$item $temp $count
      done


taglin_table_modify custom_type 0x3 time_gen_10g 1 1
taglin_table_modify seq_num_offset 0x2e time_gen_10g 1 1
taglin_table_modify timestamp_offset 0x32 time_gen_10g 1 1
taglin_table_modify time_stamp_type 0x0 time_gen_10g 1 1
taglin_table_modify fill_start_pos 0x400 time_gen_10g 1 1
taglin_table_modify fill_type 0x1 time_gen_10g 1 1
taglin_table_modify service_id 0x1 time_gen_10g 1 1
taglin_table_modify frame_length 0x80 time_gen_10g 1 1
taglin_table_modify bytes_per_second 0xc350 time_gen_10g 1 1
taglin_table_modify use_idt 0x0 time_gen_10g 1 1
taglin_table_modify frame_count 0xffff time_gen_10g 1 1
taglin_table_modify udp_checksum_location 0x2c time_gen_10g 1 1
taglin_table_modify udp_header 0x1 time_gen_10g 1 1
taglin_table_modify continuous 0x0 time_gen_10g 1 1
taglin_table_modify valid 0x0 time_gen_10g 1 1

taglinreg TAGLIN_REG_ENTRY_DATA0   0x0008
taglinreg TAGLIN_REG_ENTRY_DATA1   0xd5be
taglinreg TAGLIN_REG_ENTRY_DATA2   0x5a01
taglinreg TAGLIN_REG_ENTRY_DATA3   0x0002
taglinreg TAGLIN_REG_ENTRY_DATA4   0xdca3
taglinreg TAGLIN_REG_ENTRY_DATA5   0x5a01
taglinreg TAGLIN_REG_ENTRY_DATA6   0x0002
taglinreg TAGLIN_REG_ENTRY_DATA7   0x001e
taglinreg TAGLIN_REG_ENTRY_DATA8   0x0068
taglinreg TAGLIN_REG_ENTRY_DATA9   0x0200
taglinreg TAGLIN_REG_ENTRY_DATA10  0x01e0
taglinreg TAGLIN_REG_ENTRY_DATA11  0x0000
taglinreg TAGLIN_REG_ENTRY_DATA12  0x0000
taglinreg TAGLIN_REG_ENTRY_DATA13  0x0000
taglinreg TAGLIN_REG_ENTRY_DATA14  0x0000
taglinreg TAGLIN_REG_ENTRY_DATA15  0x0000
taglinreg TAGLIN_REG_ENTRY_DATA16  0x0000
taglinreg TAGLIN_REG_ENTRY_DATA17  0x8e00
taglinreg TAGLIN_REG_ENTRY_DATA18  0x8e00
taglinreg TAGLIN_REG_ENTRY_DATA19 0x0000
taglinreg TAGLIN_REG_ENTRY_DATA20 0x0000
taglinreg TAGLIN_REG_ENTRY_DATA21 0x0000
taglinreg TAGLIN_REG_ENTRY_DATA22 0x0000
taglinreg TAGLIN_REG_ENTRY_DATA23 0x0000
taglinreg TAGLIN_REG_ENTRY_DATA24 0x0000
taglinreg TAGLIN_REG_ENTRY_DATA25 0x0000
taglinreg TAGLIN_REG_ENTRY_DATA26 0x0000
taglinreg TAGLIN_REG_ENTRY_DATA27 0x0000
taglinreg TAGLIN_REG_ENTRY_DATA28 0x0000
taglinreg TAGLIN_REG_ENTRY_DATA29 0x0000
taglinreg TAGLIN_REG_ENTRY_DATA30 0x0000

taglinreg TAGLIN_REG_CLASSIFIER_CTRL.ADD_ENTRY 0x1
taglinreg TAGLIN_REG_CLASSIFIER_FILL_LEVEL.

}



