Subversion Repositories Kolibri OS

Rev

Rev 5363 | Go to most recent revision | Show entire file | Ignore whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 5363 Rev 5522
Line 592... Line 592...
592
        DEBUGF  1, "21040 compatibility mode\n"
592
        DEBUGF  1, "21040 compatibility mode\n"
593
        mov     [ebx + device.id], DC21040
593
        mov     [ebx + device.id], DC21040
594
  @@:
594
  @@:
Line 595... Line -...
595
 
-
 
596
 
-
 
597
;;; Find connected mii xceivers? 993-1043
595
 
598
 
596
 
599
; Reset the xcvr interface and turn on heartbeat.
597
; Reset the xcvr interface and turn on heartbeat.
600
        cmp     [ebx + device.id], DC21041
598
        cmp     [ebx + device.id], DC21041
601
        jne     @f
599
        jne     @f
Line 867... Line 865...
867
        mov     ecx, RX_RING_SIZE
865
        mov     ecx, RX_RING_SIZE
868
  .loop_rx_des:
866
  .loop_rx_des:
869
        DEBUGF  1,"RX descriptor 0x%x\n", edi
867
        DEBUGF  1,"RX descriptor 0x%x\n", edi
870
        add     edx, sizeof.desc
868
        add     edx, sizeof.desc
871
        mov     [edi + desc.status], DES0_OWN
869
        mov     [edi + desc.status], DES0_OWN
872
        mov     [edi + desc.length], 1536
870
        mov     [edi + desc.length], 1514
873
        push    edx edi ecx
871
        push    edx edi ecx
874
        invoke  KernelAlloc, 1536
872
        invoke  NetAlloc, 1514+NET_BUFF.data
875
        pop     ecx edi edx
873
        pop     ecx edi edx
876
        test    eax, eax
874
        test    eax, eax
877
        jz      .out_of_mem
875
        jz      .out_of_mem
878
        mov     [edi + RX_RING_SIZE*sizeof.desc], eax
876
        mov     [edi + RX_RING_SIZE*sizeof.desc], eax
-
 
877
        push    edx
879
        invoke  GetPhysAddr
878
        invoke  GetPhysAddr
-
 
879
        add     eax, NET_BUFF.data
-
 
880
        pop     edx
880
        mov     [edi + desc.buffer1], eax
881
        mov     [edi + desc.buffer1], eax
881
        mov     [edi + desc.buffer2], edx
882
        mov     [edi + desc.buffer2], edx
882
        add     edi, sizeof.desc
883
        add     edi, sizeof.desc
883
        dec     ecx
884
        dec     ecx
884
        jnz     .loop_rx_des
885
        jnz     .loop_rx_des
-
 
886
 
885
; set last descriptor as LAST
887
; set last descriptor as LAST
886
        or      [edi - sizeof.desc + desc.length], RDES1_RER           ; EndOfRing
888
        or      [edi - sizeof.desc + desc.length], RDES1_RER           ; EndOfRing
887
        pop     [edi - sizeof.desc + desc.buffer2]                     ; point it to the first descriptor
889
        pop     [edi - sizeof.desc + desc.buffer2]                     ; point it to the first descriptor
Line 888... Line 890...
888
 
890
 
Line 915... Line 917...
915
        xor     eax, eax
917
        xor     eax, eax
916
        mov     [ebx + device.cur_tx], eax
918
        mov     [ebx + device.cur_tx], eax
917
        mov     [ebx + device.last_tx], eax
919
        mov     [ebx + device.last_tx], eax
918
        mov     [ebx + device.cur_rx], eax
920
        mov     [ebx + device.cur_rx], eax
Line -... Line 921...
-
 
921
 
919
 
922
;        xor     eax, eax
Line 920... Line 923...
920
        ret
923
        ret
921
 
924
 
922
  .out_of_mem:
925
  .out_of_mem:
Line 1041... Line 1044...
1041
align 4
1044
align 4
1042
create_setup_frame:
1045
create_setup_frame:
Line 1043... Line 1046...
1043
 
1046
 
Line 1044... Line 1047...
1044
        DEBUGF  1,"Creating setup packet\n"
1047
        DEBUGF  1,"Creating setup packet\n"
1045
 
1048
 
1046
        invoke  KernelAlloc, 192
1049
        invoke  NetAlloc, 192 + NET_BUFF.data
-
 
1050
        test    eax, eax
-
 
1051
        jz      .err
Line 1047... Line 1052...
1047
        test    eax, eax
1052
        mov     [eax + NET_BUFF.device], ebx
Line 1048... Line 1053...
1048
        jz      .err
1053
        mov     [eax + NET_BUFF.length], 192
1049
 
1054
 
1050
        push    eax
1055
        push    eax
1051
 
1056
 
1052
        mov     edi, eax
1057
        lea     edi, [eax + NET_BUFF.data]
1053
        xor     eax, eax
1058
        xor     eax, eax
Line 1069... Line 1074...
1069
; setup descriptor
1074
; setup descriptor
1070
        lea     edi, [ebx + device.tx_ring]
1075
        lea     edi, [ebx + device.tx_ring]
1071
        DEBUGF  1, "attaching setup packet 0x%x to descriptor 0x%x\n", eax, edi
1076
        DEBUGF  1, "attaching setup packet 0x%x to descriptor 0x%x\n", eax, edi
1072
        mov     [edi + TX_RING_SIZE*sizeof.desc], eax
1077
        mov     [edi + TX_RING_SIZE*sizeof.desc], eax
1073
        invoke  GetPhysAddr
1078
        invoke  GetPhysAddr
-
 
1079
        add     eax, NET_BUFF.data
1074
        mov     [edi + desc.buffer1], eax
1080
        mov     [edi + desc.buffer1], eax
1075
        mov     [edi + desc.length], TDES1_SET + 192        ; size must be EXACTLY 192 bytes + TDES1_IC
1081
        mov     [edi + desc.length], TDES1_SET or 192       ; size must be EXACTLY 192 bytes + TDES1_IC
1076
        mov     [edi + desc.status], DES0_OWN
1082
        mov     [edi + desc.status], DES0_OWN
1077
        DEBUGF  1, "descriptor 0x%x\n", edi
1083
        DEBUGF  1, "descriptor 0x%x\n", edi
Line 1078... Line 1084...
1078
 
1084
 
1079
; go to next descriptor
1085
; go to next descriptor
-
 
1086
        inc     [ebx + device.cur_tx]
Line -... Line 1087...
-
 
1087
        and     [ebx + device.cur_tx], TX_RING_SIZE-1
1080
        inc     [ebx + device.cur_tx]
1088
 
Line 1081... Line 1089...
1081
 
1089
        xor     eax, eax
1082
        ret
1090
        ret
-
 
1091
 
1083
 
1092
  .err:
Line 1084... Line 1093...
1084
  .err:
1093
        DEBUGF  2, "Out of memory!\n"
1085
        DEBUGF  2, "Out of memory!\n"
1094
        or      eax, -1
1086
        ret
1095
        ret
1087
 
1096
 
1088
 
1097
 
1089
 
1098
 
1090
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
-
 
1091
;;                                         ;;
1099
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1092
;; Transmit                                ;;
1100
;;                                         ;;
Line 1093... Line 1101...
1093
;;                                         ;;
1101
;; Transmit                                ;;
Line 1094... Line 1102...
1094
;; In: buffer pointer in [esp+4]           ;;
1102
;;                                         ;;
1095
;;     size of buffer in [esp+8]           ;;
1103
;; In:  ebx = pointer to device structure  ;;
Line -... Line 1104...
-
 
1104
;; Out: eax = 0 on success                 ;;
1096
;;     pointer to device structure in ebx  ;;
1105
;;                                         ;;
1097
;;                                         ;;
1106
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1098
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
1107
 
1099
 
1108
proc transmit stdcall bufferptr
1100
proc transmit stdcall bufferptr, buffersize
1109
 
1101
 
1110
        pushf
Line 1102... Line 1111...
1102
        pushf
1111
        cli
1103
        cli
1112
 
-
 
1113
        mov     esi, [bufferptr]
-
 
1114
        DEBUGF  1,"Transmitting packet, buffer:%x, size:%u\n", [bufferptr], [esi + NET_BUFF.length]
Line 1104... Line 1115...
1104
 
1115
        lea     eax, [esi + NET_BUFF.data]
1105
        DEBUGF  1,"Transmitting packet, buffer:%x, size:%u\n", [bufferptr], [buffersize]
1116
        DEBUGF  1,"To: %x-%x-%x-%x-%x-%x From: %x-%x-%x-%x-%x-%x Type:%x%x\n",\
1106
        mov     eax, [bufferptr]
1117
        [eax+00]:2,[eax+01]:2,[eax+02]:2,[eax+03]:2,[eax+04]:2,[eax+05]:2,\
1107
        DEBUGF  1,"To: %x-%x-%x-%x-%x-%x From: %x-%x-%x-%x-%x-%x Type:%x%x\n",\
1118
        [eax+06]:2,[eax+07]:2,[eax+08]:2,[eax+09]:2,[eax+10]:2,[eax+11]:2,\
1108
        [eax+00]:2,[eax+01]:2,[eax+02]:2,[eax+03]:2,[eax+04]:2,[eax+05]:2,\
1119
        [eax+13]:2,[eax+12]:2
1109
        [eax+06]:2,[eax+07]:2,[eax+08]:2,[eax+09]:2,[eax+10]:2,[eax+11]:2,\
1120
 
Line 1110... Line -...
1110
        [eax+13]:2,[eax+12]:2
-
 
1111
 
-
 
1112
        cmp     [buffersize], 1514
1121
        cmp     [esi + NET_BUFF.length], 1514
1113
        ja      .fail
1122
        ja      .fail
-
 
1123
        cmp     [esi + NET_BUFF.length], 60
1114
 
1124
        jb      .fail
1115
        mov     eax, [ebx + device.cur_tx]
1125
 
Line 1116... Line 1126...
1116
        mov     edx, sizeof.desc
1126
        mov     eax, [ebx + device.cur_tx]
1117
        mul     edx
1127
        mov     edx, sizeof.desc
1118
        lea     esi, [ebx + device.tx_ring + eax]
1128
        mul     edx
1119
        test    [esi + desc.status], DES0_OWN
1129
        lea     edi, [ebx + device.tx_ring + eax]
1120
        jnz     .fail
1130
        test    [edi + desc.status], DES0_OWN
1121
 
1131
        jnz     .fail
Line 1122... Line 1132...
1122
        DEBUGF  1, "Descriptor is free\n"
1132
 
1123
 
1133
        mov     eax, [bufferptr]
Line 1124... Line 1134...
1124
        mov     eax, [bufferptr]
1134
        mov     [edi + TX_RING_SIZE*sizeof.desc], eax
1125
        mov     [esi + TX_RING_SIZE*sizeof.desc], eax
1135
        add     eax, [eax + NET_BUFF.offset]
1126
        invoke  GetPhysAddr
1136
        invoke  GetPhysAddr
1127
        mov     [esi + desc.buffer1], eax
1137
        mov     [edi + desc.buffer1], eax
Line 1153... Line 1163...
1153
  .do_it:
1163
  .do_it:
1154
        out     dx, eax
1164
        out     dx, eax
Line 1155... Line 1165...
1155
 
1165
 
1156
; Update stats
1166
; Update stats
1157
        inc     [ebx + device.packets_tx]
1167
        inc     [ebx + device.packets_tx]
1158
        mov     eax, [buffersize]
1168
        mov     ecx, [esi + NET_BUFF.length]
1159
        add     dword [ebx + device.bytes_tx], eax
1169
        add     dword [ebx + device.bytes_tx], ecx
Line 1160... Line 1170...
1160
        adc     dword [ebx + device.bytes_tx + 4], 0
1170
        adc     dword [ebx + device.bytes_tx + 4], 0
1161
 
1171
 
1162
; go to next descriptor
1172
; go to next descriptor
Line 1167... Line 1177...
1167
        popf
1177
        popf
1168
        xor     eax, eax
1178
        xor     eax, eax
1169
        ret
1179
        ret
Line 1170... Line 1180...
1170
 
1180
 
1171
  .fail:
1181
  .fail:
1172
        DEBUGF  2,"Transmit failed\n"
1182
        DEBUGF  1,"Transmit failed\n"
1173
        invoke  KernelFree, [bufferptr]
1183
        invoke  NetFree, [bufferptr]
1174
        popf
1184
        popf
1175
        or      eax, -1
1185
        or      eax, -1
Line 1176... Line 1186...
1176
        ret
1186
        ret
Line 1238... Line 1248...
1238
        jnz     .end_tx
1248
        jnz     .end_tx
1239
        cmp     [eax + desc.buffer1], 0                 ; empty descriptor?
1249
        cmp     [eax + desc.buffer1], 0                 ; empty descriptor?
1240
        je      .end_tx
1250
        je      .end_tx
Line 1241... Line 1251...
1241
 
1251
 
1242
        mov     [eax + desc.buffer1], 0
1252
        mov     [eax + desc.buffer1], 0
1243
        DEBUGF  1,"Free buffer 0x%x\n", [eax + TX_RING_SIZE*sizeof.desc]
1253
        DEBUGF  1, "Free buffer 0x%x\n", [eax + TX_RING_SIZE*sizeof.desc]
Line 1244... Line 1254...
1244
        invoke  KernelFree, [eax + TX_RING_SIZE*sizeof.desc]
1254
        invoke  NetFree, [eax + TX_RING_SIZE*sizeof.desc]
1245
 
1255
 
1246
        ; advance to next descriptor
1256
        ; advance to next descriptor
Line 1252... Line 1262...
1252
        pop     ecx esi eax
1262
        pop     ecx esi eax
1253
  .not_tx:
1263
  .not_tx:
Line 1254... Line 1264...
1254
 
1264
 
1255
;----------------------------------
1265
;----------------------------------
1256
; RX irq
-
 
1257
 
1266
; RX irq
1258
        test    eax, CSR5_RI
1267
        test    eax, CSR5_RI
1259
        jz      .not_rx
1268
        jz      .not_rx
Line 1260... Line 1269...
1260
        push    eax esi ecx
1269
        push    eax esi ecx
Line 1261... Line 1270...
1261
 
1270
 
1262
        DEBUGF 1,"RX ok!\n"
1271
        DEBUGF 1,"RX ok!\n"
1263
 
1272
 
Line 1264... Line 1273...
1264
        push    ebx
1273
        push    ebx
1265
  .rx_loop:
1274
  .rx_loop:
1266
        pop     ebx
1275
        pop     ebx
1267
 
1276
 
1268
; get current descriptor
1277
        ; get current descriptor
Line 1269... Line 1278...
1269
        mov     eax, [ebx + device.cur_rx]
1278
        mov     eax, [ebx + device.cur_rx]
1270
        mov     edx, sizeof.desc
1279
        mov     edx, sizeof.desc
Line 1271... Line 1280...
1271
        mul     edx
1280
        mul     edx
1272
        lea     edi, [ebx + device.rx_ring + eax]
1281
        lea     edi, [ebx + device.rx_ring + eax]
1273
 
1282
 
Line 1288... Line 1297...
1288
        shr     ecx, RDES0_FL_SH
1297
        shr     ecx, RDES0_FL_SH
1289
        and     ecx, RDES0_FL_MASK
1298
        and     ecx, RDES0_FL_MASK
1290
        sub     ecx, 4                                  ; throw away the CRC
1299
        sub     ecx, 4                                  ; throw away the CRC
1291
        DEBUGF  1,"got %u bytes\n", ecx
1300
        DEBUGF  1,"got %u bytes\n", ecx
Line 1292... Line 1301...
1292
 
1301
 
1293
; Push arguments for Eth_input (and some more...)
1302
; Push arguments for EthInput (and some more...)
1294
        push    ebx
1303
        push    ebx
1295
        push    .rx_loop                                ; return addr
1304
        push    .rx_loop                                ; return addr
-
 
1305
        mov     eax, dword[edi + RX_RING_SIZE*sizeof.desc]
-
 
1306
        push    eax
-
 
1307
        mov     [eax + NET_BUFF.length], ecx
1296
        push    ecx                                     ; packet size
1308
        mov     [eax + NET_BUFF.device], ebx
Line 1297... Line 1309...
1297
        push    dword[edi + RX_RING_SIZE*sizeof.desc]   ; packet ptr
1309
        mov     [eax + NET_BUFF.offset], NET_BUFF.data
1298
 
1310
 
1299
; update statistics
1311
; update statistics
1300
        inc     [ebx + device.packets_rx]
1312
        inc     [ebx + device.packets_rx]
Line 1301... Line 1313...
1301
        add     dword[ebx + device.bytes_rx], ecx
1313
        add     dword[ebx + device.bytes_rx], ecx
1302
        adc     dword[ebx + device.bytes_rx + 4], 0
1314
        adc     dword[ebx + device.bytes_rx + 4], 0
1303
 
1315
 
1304
; Allocate new descriptor
1316
; Allocate new descriptor
-
 
1317
        push    edi ebx
1305
        push    edi ebx
1318
        invoke  NetAlloc, 1514 + NET_BUFF.data          ; Allocate a buffer to put packet into
1306
        invoke  KernelAlloc, 1536                       ; Allocate a buffer to put packet into
1319
        pop     ebx edi
-
 
1320
        jz      .fail
1307
        pop     ebx edi
1321
        mov     [edi + RX_RING_SIZE*sizeof.desc], eax
1308
        mov     [edi + RX_RING_SIZE*sizeof.desc], eax
1322
        invoke  GetPhysAddr
Line 1309... Line 1323...
1309
        invoke  GetPhysAddr
1323
        add     eax, NET_BUFF.data
1310
        mov     [edi + desc.buffer1], eax
1324
        mov     [edi + desc.buffer1], eax
1311
        mov     [edi + desc.status], DES0_OWN           ; mark descriptor as being free
1325
        mov     [edi + desc.status], DES0_OWN           ; mark descriptor as being free
Line 1312... Line 1326...
1312
 
1326
 
1313
; Move to next rx desc
1327
; Move to next rx desc
-
 
1328
        inc     [ebx + device.cur_rx]                   ; next descriptor
-
 
1329
        and     [ebx + device.cur_rx], RX_RING_SIZE-1
1314
        inc     [ebx + device.cur_rx]                   ; next descriptor
1330
 
Line 1315... Line 1331...
1315
        and     [ebx + device.cur_rx], RX_RING_SIZE-1
1331
        jmp     [EthInput]
1316
 
1332
  .end_rx: