3 Copyright (C) 2001-2005 Neil Cafferkey
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
10 This program is distributed in the hope that it will be useful, but
11 WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 General Public License for more details.
15 You should have received a copy of the GNU General Public License
16 along with this program; if not, write to the Free Software
17 Foundation, Inc., 59 Temple Place - Suite 330, Boston,
23 #include <exec/types.h>
24 #include <exec/errors.h>
25 #include <exec/initializers.h>
26 #include <devices/newstyle.h>
28 #include <proto/exec.h>
29 #include <proto/utility.h>
33 #include "request_protos.h"
34 #include "unit_protos.h"
37 #define KNOWN_EVENTS \
38 (S2EVENT_ERROR | S2EVENT_TX | S2EVENT_RX | S2EVENT_ONLINE \
39 | S2EVENT_OFFLINE | S2EVENT_BUFF | S2EVENT_HARDWARE | S2EVENT_SOFTWARE)
42 static BOOL
CmdInvalid(struct IOSana2Req
*request
, struct DevBase
*base
);
43 static BOOL
CmdRead(struct IOSana2Req
*request
, struct DevBase
*base
);
44 static BOOL
CmdWrite(struct IOSana2Req
*request
, struct DevBase
*base
);
45 static BOOL
CmdFlush(struct IORequest
*request
, struct DevBase
*base
);
46 static BOOL
CmdS2DeviceQuery(struct IOSana2Req
*request
,
47 struct DevBase
*base
);
48 static BOOL
CmdGetStationAddress(struct IOSana2Req
*request
,
49 struct DevBase
*base
);
50 static BOOL
CmdConfigInterface(struct IOSana2Req
*request
,
51 struct DevBase
*base
);
52 static BOOL
CmdBroadcast(struct IOSana2Req
*request
,
53 struct DevBase
*base
);
54 static BOOL
CmdTrackType(struct IOSana2Req
*request
,
55 struct DevBase
*base
);
56 static BOOL
CmdUntrackType(struct IOSana2Req
*request
,
57 struct DevBase
*base
);
58 static BOOL
CmdGetTypeStats(struct IOSana2Req
*request
,
59 struct DevBase
*base
);
60 static BOOL
CmdGetSpecialStats(struct IOSana2Req
*request
,
61 struct DevBase
*base
);
62 static BOOL
CmdGetGlobalStats(struct IOSana2Req
*request
,
63 struct DevBase
*base
);
64 static BOOL
CmdOnEvent(struct IOSana2Req
*request
, struct DevBase
*base
);
65 static BOOL
CmdReadOrphan(struct IOSana2Req
*request
,
66 struct DevBase
*base
);
67 static BOOL
CmdOnline(struct IOSana2Req
*request
, struct DevBase
*base
);
68 static BOOL
CmdOffline(struct IOSana2Req
*request
, struct DevBase
*base
);
69 static BOOL
CmdDeviceQuery(struct IOStdReq
*request
,
70 struct DevBase
*base
);
71 static BOOL
CmdAddMulticastAddresses(struct IOSana2Req
*request
,
72 struct DevBase
*base
);
73 static BOOL
CmdDelMulticastAddresses(struct IOSana2Req
*request
,
74 struct DevBase
*base
);
77 static const UWORD supported_commands
[] =
85 S2_ADDMULTICASTADDRESS
,
86 S2_DELMULTICASTADDRESS
,
99 S2_ADDMULTICASTADDRESSES
,
100 S2_DELMULTICASTADDRESSES
,
104 static const struct Sana2DeviceQuery sana2_info
=
116 const TEXT badmulticast_name
[] = "Bad multicasts";
117 const TEXT retries_name
[] = "Retries";
118 const TEXT fifo_underruns_name
[] = "Underruns";
120 const TEXT
*const special_stat_names
[] =
129 /****i* intelpro100.device/ServiceRequest **********************************
132 * ServiceRequest -- Attempt to service a device request.
135 * ServiceRequest(request)
137 * VOID ServiceRequest(struct IORequest *);
140 * Attempts to carry out a request. The relevant unit's semaphore must
141 * be obtained before calling this function. This function releases the
142 * semaphore before returning.
145 * request - The request to service.
150 ****************************************************************************
154 VOID
ServiceRequest(struct IOSana2Req
*request
, struct DevBase
*base
)
158 switch(request
->ios2_Req
.io_Command
)
161 complete
= CmdRead(request
, base
);
164 complete
= CmdWrite(request
, base
);
167 complete
= CmdFlush((APTR
)request
, base
);
170 complete
= CmdS2DeviceQuery((APTR
)request
, base
);
172 case S2_GETSTATIONADDRESS
:
173 complete
= CmdGetStationAddress((APTR
)request
, base
);
175 case S2_CONFIGINTERFACE
:
176 complete
= CmdConfigInterface((APTR
)request
, base
);
178 case S2_ADDMULTICASTADDRESS
:
179 complete
= CmdAddMulticastAddresses((APTR
)request
, base
);
181 case S2_DELMULTICASTADDRESS
:
182 complete
= CmdDelMulticastAddresses((APTR
)request
, base
);
185 complete
= CmdWrite((APTR
)request
, base
);
188 complete
= CmdBroadcast((APTR
)request
, base
);
191 complete
= CmdTrackType((APTR
)request
, base
);
194 complete
= CmdUntrackType((APTR
)request
, base
);
196 case S2_GETTYPESTATS
:
197 complete
= CmdGetTypeStats((APTR
)request
, base
);
199 case S2_GETSPECIALSTATS
:
200 complete
= CmdGetSpecialStats((APTR
)request
, base
);
202 case S2_GETGLOBALSTATS
:
203 complete
= CmdGetGlobalStats((APTR
)request
, base
);
206 complete
= CmdOnEvent((APTR
)request
, base
);
209 complete
= CmdReadOrphan((APTR
)request
, base
);
212 complete
= CmdOnline((APTR
)request
, base
);
215 complete
= CmdOffline((APTR
)request
, base
);
217 case NSCMD_DEVICEQUERY
:
218 complete
= CmdDeviceQuery((APTR
)request
, base
);
220 case S2_ADDMULTICASTADDRESSES
:
221 complete
= CmdAddMulticastAddresses((APTR
)request
, base
);
223 case S2_DELMULTICASTADDRESSES
:
224 complete
= CmdDelMulticastAddresses((APTR
)request
, base
);
227 complete
= CmdInvalid((APTR
)request
, base
);
230 if(complete
&& ((request
->ios2_Req
.io_Flags
& IOF_QUICK
) == 0))
231 ReplyMsg((APTR
)request
);
233 ReleaseSemaphore(&((struct DevUnit
*)request
->ios2_Req
.io_Unit
)->
240 /****i* intelpro100.device/CMD_INVALID *************************************
243 * CMD_INVALID -- Reject invalid commands.
246 * See SANA-II documentation.
248 ****************************************************************************
252 static BOOL
CmdInvalid(struct IOSana2Req
*request
, struct DevBase
*base
)
254 request
->ios2_Req
.io_Error
= IOERR_NOCMD
;
255 request
->ios2_WireError
= S2WERR_GENERIC_ERROR
;
262 /****** intelpro100.device/CMD_READ ****************************************
265 * CMD_READ -- Read data.
268 * See SANA-II documentation.
270 ****************************************************************************
274 static BOOL
CmdRead(struct IOSana2Req
*request
, struct DevBase
*base
)
276 struct DevUnit
*unit
;
277 struct Opener
*opener
;
278 BOOL complete
= FALSE
;
280 unit
= (APTR
)request
->ios2_Req
.io_Unit
;
282 if((unit
->flags
& UNITF_ONLINE
) != 0)
284 opener
= request
->ios2_BufferManagement
;
285 PutRequest(&opener
->read_port
, (APTR
)request
, base
);
289 request
->ios2_Req
.io_Error
= S2ERR_OUTOFSERVICE
;
290 request
->ios2_WireError
= S2WERR_UNIT_OFFLINE
;
301 /****** intelpro100.device/CMD_WRITE ***************************************
304 * CMD_WRITE -- Write data.
307 * See SANA-II documentation.
309 ****************************************************************************
313 /****** intelpro100.device/S2_MULTICAST ************************************
319 * See SANA-II documentation.
321 ****************************************************************************
325 static BOOL
CmdWrite(struct IOSana2Req
*request
, struct DevBase
*base
)
327 struct DevUnit
*unit
;
330 BOOL complete
= FALSE
;
332 /* Check request is valid */
334 unit
= (APTR
)request
->ios2_Req
.io_Unit
;
335 if((unit
->flags
& UNITF_ONLINE
) == 0)
337 error
= S2ERR_OUTOFSERVICE
;
338 wire_error
= S2WERR_UNIT_OFFLINE
;
340 else if((request
->ios2_Req
.io_Command
== S2_MULTICAST
) &&
341 ((request
->ios2_DstAddr
[0] & 0x1) == 0))
343 error
= S2ERR_BAD_ADDRESS
;
344 wire_error
= S2WERR_BAD_MULTICAST
;
347 /* Queue request for sending */
350 PutRequest(unit
->request_ports
[WRITE_QUEUE
], (APTR
)request
, base
);
353 request
->ios2_Req
.io_Error
= error
;
354 request
->ios2_WireError
= wire_error
;
365 /****** intelpro100.device/CMD_FLUSH ***************************************
371 * See SANA-II documentation.
373 ****************************************************************************
377 static BOOL
CmdFlush(struct IORequest
*request
, struct DevBase
*base
)
379 FlushUnit((APTR
)request
->io_Unit
, EVENT_QUEUE
, IOERR_ABORTED
, base
);
386 /****** intelpro100.device/S2_DEVICEQUERY **********************************
389 * S2_DEVICEQUERY -- Query device capabilities.
392 * See SANA-II documentation.
394 ****************************************************************************
398 static BOOL
CmdS2DeviceQuery(struct IOSana2Req
*request
,
399 struct DevBase
*base
)
401 struct DevUnit
*unit
;
402 struct Sana2DeviceQuery
*info
;
403 ULONG size_available
, size
;
405 /* Copy device info */
407 unit
= (APTR
)request
->ios2_Req
.io_Unit
;
408 info
= request
->ios2_StatData
;
409 size
= size_available
= info
->SizeAvailable
;
410 if(size
> sizeof(struct Sana2DeviceQuery
))
411 size
= sizeof(struct Sana2DeviceQuery
);
413 CopyMem(&sana2_info
, info
, size
);
414 info
->BPS
= unit
->speed
;
416 info
->SizeAvailable
= size_available
;
417 info
->SizeSupplied
= size
;
426 /****** intelpro100.device/S2_GETSTATIONADDDRESS ***************************
429 * S2_GETSTATIONADDDRESS
432 * See SANA-II documentation.
434 ****************************************************************************
438 static BOOL
CmdGetStationAddress(struct IOSana2Req
*request
,
439 struct DevBase
*base
)
441 struct DevUnit
*unit
;
445 unit
= (APTR
)request
->ios2_Req
.io_Unit
;
446 CopyMem(unit
->address
, request
->ios2_SrcAddr
, ETH_ADDRESSSIZE
);
447 CopyMem(unit
->default_address
, request
->ios2_DstAddr
, ETH_ADDRESSSIZE
);
456 /****** intelpro100.device/S2_CONFIGINTERFACE ******************************
459 * S2_CONFIGINTERFACE --
462 * See SANA-II documentation.
464 ****************************************************************************
468 static BOOL
CmdConfigInterface(struct IOSana2Req
*request
,
469 struct DevBase
*base
)
471 struct DevUnit
*unit
;
473 /* Configure adapter */
475 unit
= (APTR
)request
->ios2_Req
.io_Unit
;
476 if((unit
->flags
& UNITF_CONFIGURED
) == 0)
478 CopyMem(request
->ios2_SrcAddr
, unit
->address
, ETH_ADDRESSSIZE
);
479 if((unit
->flags
& UNITF_HAVEADAPTER
) != 0)
480 ConfigureAdapter(unit
, base
);
481 unit
->flags
|= UNITF_CONFIGURED
;
485 request
->ios2_Req
.io_Error
= S2ERR_BAD_STATE
;
486 request
->ios2_WireError
= S2WERR_IS_CONFIGURED
;
496 /****** intelpro100.device/S2_BROADCAST ************************************
502 * See SANA-II documentation.
504 ****************************************************************************
508 static BOOL
CmdBroadcast(struct IOSana2Req
*request
,
509 struct DevBase
*base
)
511 /* Fill in the broadcast address as destination */
513 *((ULONG
*)request
->ios2_DstAddr
) = 0xffffffff;
514 *((UWORD
*)(request
->ios2_DstAddr
+ 4)) = 0xffff;
516 /* Queue the write as normal */
518 return CmdWrite(request
, base
);
523 /****** intelpro100.device/S2_TRACKTYPE ************************************
529 * See SANA-II documentation.
531 ****************************************************************************
535 static BOOL
CmdTrackType(struct IOSana2Req
*request
,
536 struct DevBase
*base
)
538 struct DevUnit
*unit
;
539 struct Opener
*opener
;
540 ULONG packet_type
, wire_error
;
541 struct TypeTracker
*tracker
;
542 struct TypeStats
*initial_stats
;
545 unit
= (APTR
)request
->ios2_Req
.io_Unit
;
546 packet_type
= request
->ios2_PacketType
;
548 /* Get global tracker */
550 tracker
= (struct TypeTracker
*)
551 FindTypeStats(unit
, &unit
->type_trackers
, packet_type
, base
);
554 tracker
->user_count
++;
558 AllocMem(sizeof(struct TypeTracker
), MEMF_PUBLIC
| MEMF_CLEAR
);
561 tracker
->packet_type
= packet_type
;
562 tracker
->user_count
= 1;
565 AddTail((APTR
)&unit
->type_trackers
, (APTR
)tracker
);
570 /* Store initial figures for this opener */
572 opener
= request
->ios2_BufferManagement
;
573 initial_stats
= FindTypeStats(unit
, &opener
->initial_stats
, packet_type
,
576 if(initial_stats
!= NULL
)
578 error
= S2ERR_BAD_STATE
;
579 wire_error
= S2WERR_ALREADY_TRACKED
;
584 initial_stats
= AllocMem(sizeof(struct TypeStats
), MEMF_PUBLIC
);
585 if(initial_stats
== NULL
)
587 error
= S2ERR_NO_RESOURCES
;
588 wire_error
= S2WERR_GENERIC_ERROR
;
594 CopyMem(tracker
, initial_stats
, sizeof(struct TypeStats
));
595 AddTail((APTR
)&opener
->initial_stats
, (APTR
)initial_stats
);
600 request
->ios2_Req
.io_Error
= error
;
601 request
->ios2_WireError
= wire_error
;
607 /****** intelpro100.device/S2_UNTRACKTYPE **********************************
613 * See SANA-II documentation.
615 ****************************************************************************
619 static BOOL
CmdUntrackType(struct IOSana2Req
*request
,
620 struct DevBase
*base
)
622 struct DevUnit
*unit
;
623 struct Opener
*opener
;
625 struct TypeTracker
*tracker
;
626 struct TypeStats
*initial_stats
;
628 unit
= (APTR
)request
->ios2_Req
.io_Unit
;
629 packet_type
= request
->ios2_PacketType
;
631 /* Get global tracker and initial figures */
633 tracker
= (struct TypeTracker
*)
634 FindTypeStats(unit
, &unit
->type_trackers
, packet_type
, base
);
635 opener
= request
->ios2_BufferManagement
;
636 initial_stats
= FindTypeStats(unit
, &opener
->initial_stats
, packet_type
,
639 /* Decrement tracker usage and free unused structures */
641 if(initial_stats
!= NULL
)
643 if((--tracker
->user_count
) == 0)
646 Remove((APTR
)tracker
);
648 FreeMem(tracker
, sizeof(struct TypeTracker
));
651 Remove((APTR
)initial_stats
);
652 FreeMem(initial_stats
, sizeof(struct TypeStats
));
656 request
->ios2_Req
.io_Error
= S2ERR_BAD_STATE
;
657 request
->ios2_WireError
= S2WERR_NOT_TRACKED
;
667 /****** intelpro100.device/S2_GETTYPESTATS *********************************
673 * See SANA-II documentation.
675 ****************************************************************************
679 static BOOL
CmdGetTypeStats(struct IOSana2Req
*request
,
680 struct DevBase
*base
)
682 struct DevUnit
*unit
;
683 struct Opener
*opener
;
685 struct TypeStats
*initial_stats
, *tracker
;
686 struct Sana2PacketTypeStats
*stats
;
688 unit
= (APTR
)request
->ios2_Req
.io_Unit
;
689 packet_type
= request
->ios2_PacketType
;
691 /* Get global tracker and initial figures */
693 tracker
= FindTypeStats(unit
, &unit
->type_trackers
, packet_type
, base
);
694 opener
= request
->ios2_BufferManagement
;
695 initial_stats
= FindTypeStats(unit
, &opener
->initial_stats
, packet_type
,
698 /* Copy and adjust figures */
700 if(initial_stats
!= NULL
)
702 stats
= request
->ios2_StatData
;
703 CopyMem(&tracker
->stats
, stats
, sizeof(struct Sana2PacketTypeStats
));
704 stats
->PacketsSent
-= initial_stats
->stats
.PacketsSent
;
705 stats
->PacketsReceived
-= initial_stats
->stats
.PacketsReceived
;
706 stats
->BytesSent
-= initial_stats
->stats
.BytesSent
;
707 stats
->BytesReceived
-= initial_stats
->stats
.BytesReceived
;
708 stats
->PacketsDropped
-= initial_stats
->stats
.PacketsDropped
;
712 request
->ios2_Req
.io_Error
= S2ERR_BAD_STATE
;
713 request
->ios2_WireError
= S2WERR_NOT_TRACKED
;
723 /****** intelpro100.device/S2_GETSPECIALSTATS ******************************
729 * See SANA-II documentation.
731 ****************************************************************************
735 static BOOL
CmdGetSpecialStats(struct IOSana2Req
*request
,
736 struct DevBase
*base
)
738 struct DevUnit
*unit
;
740 struct Sana2SpecialStatHeader
*header
;
741 struct Sana2SpecialStatRecord
*record
;
743 /* Update and fill in stats */
745 unit
= (APTR
)request
->ios2_Req
.io_Unit
;
746 if((unit
->flags
& UNITF_ONLINE
) != 0)
749 UpdateStats(unit
, base
);
753 header
= request
->ios2_StatData
;
754 record
= (APTR
)(header
+ 1);
756 stat_count
= header
->RecordCountMax
;
757 if(stat_count
> SPECIAL_STAT_COUNT
)
758 stat_count
= SPECIAL_STAT_COUNT
;
760 for(i
= 0; i
< stat_count
; i
++)
762 record
->Type
= (S2WireType_Ethernet
<< 16) + i
;
763 record
->Count
= unit
->special_stats
[i
];
764 record
->String
= special_stat_names
[i
];
768 header
->RecordCountSupplied
= stat_count
;
777 /****** intelpro100.device/S2_GETGLOBALSTATS *******************************
783 * See SANA-II documentation.
785 ****************************************************************************
789 static BOOL
CmdGetGlobalStats(struct IOSana2Req
*request
,
790 struct DevBase
*base
)
792 struct DevUnit
*unit
;
794 /* Update and copy stats */
796 unit
= (APTR
)request
->ios2_Req
.io_Unit
;
797 if((unit
->flags
& UNITF_ONLINE
) != 0)
800 UpdateStats(unit
, base
);
803 CopyMem(&unit
->stats
, request
->ios2_StatData
,
804 sizeof(struct Sana2DeviceStats
));
813 /****** intelpro100.device/S2_ONEVENT **************************************
819 * See SANA-II documentation.
821 ****************************************************************************
825 static BOOL
CmdOnEvent(struct IOSana2Req
*request
, struct DevBase
*base
)
827 struct DevUnit
*unit
;
828 ULONG events
, wanted_events
;
829 BOOL complete
= FALSE
;
831 /* Check if we understand the event types */
833 unit
= (APTR
)request
->ios2_Req
.io_Unit
;
834 wanted_events
= request
->ios2_WireError
;
835 if((wanted_events
& ~KNOWN_EVENTS
) != 0)
837 request
->ios2_Req
.io_Error
= S2ERR_NOT_SUPPORTED
;
838 events
= S2WERR_BAD_EVENT
;
842 if((unit
->flags
& UNITF_ONLINE
) != 0)
843 events
= S2EVENT_ONLINE
;
845 events
= S2EVENT_OFFLINE
;
847 events
&= wanted_events
;
850 /* Reply request if a wanted event has already occurred */
854 request
->ios2_WireError
= events
;
858 PutRequest(unit
->request_ports
[EVENT_QUEUE
], (APTR
)request
, base
);
867 /****** intelpro100.device/S2_READORPHAN ***********************************
873 * See SANA-II documentation.
875 ****************************************************************************
879 static BOOL
CmdReadOrphan(struct IOSana2Req
*request
,
880 struct DevBase
*base
)
882 struct DevUnit
*unit
;
885 BOOL complete
= FALSE
;
887 /* Check request is valid */
889 unit
= (APTR
)request
->ios2_Req
.io_Unit
;
890 if((unit
->flags
& UNITF_ONLINE
) == 0)
892 error
= S2ERR_OUTOFSERVICE
;
893 wire_error
= S2WERR_UNIT_OFFLINE
;
899 PutRequest(unit
->request_ports
[ADOPT_QUEUE
], (APTR
)request
, base
);
902 request
->ios2_Req
.io_Error
= error
;
903 request
->ios2_WireError
= wire_error
;
914 /****** intelpro100.device/S2_ONLINE ***************************************
920 * See SANA-II documentation.
922 ****************************************************************************
926 static BOOL
CmdOnline(struct IOSana2Req
*request
, struct DevBase
*base
)
928 struct DevUnit
*unit
;
933 /* Check request is valid */
935 unit
= (APTR
)request
->ios2_Req
.io_Unit
;
936 if((unit
->flags
& UNITF_CONFIGURED
) == 0)
938 error
= S2ERR_BAD_STATE
;
939 wire_error
= S2WERR_NOT_CONFIGURED
;
941 if((unit
->flags
& UNITF_HAVEADAPTER
) == 0)
943 error
= S2ERR_OUTOFSERVICE
;
944 wire_error
= S2WERR_RCVREL_HDW_ERR
;
947 /* Clear global and special stats and put adapter back online */
949 if((error
== 0) && ((unit
->flags
& UNITF_ONLINE
) == 0))
951 UpdateStats(unit
, base
);
952 unit
->stats
.PacketsReceived
= 0;
953 unit
->stats
.PacketsSent
= 0;
954 unit
->stats
.BadData
= 0;
955 unit
->stats
.Overruns
= 0;
956 unit
->stats
.UnknownTypesReceived
= 0;
957 unit
->stats
.Reconfigurations
= 0;
959 for(i
= 0; i
< SPECIAL_STAT_COUNT
; i
++)
960 unit
->special_stats
[i
] = 0;
962 GoOnline(unit
, base
);
967 request
->ios2_Req
.io_Error
= error
;
968 request
->ios2_WireError
= wire_error
;
974 /****** intelpro100.device/S2_OFFLINE **************************************
980 * See SANA-II documentation.
982 ****************************************************************************
986 static BOOL
CmdOffline(struct IOSana2Req
*request
, struct DevBase
*base
)
988 struct DevUnit
*unit
;
990 /* Put adapter offline */
992 unit
= (APTR
)request
->ios2_Req
.io_Unit
;
993 if((unit
->flags
& UNITF_ONLINE
) != 0)
994 GoOffline(unit
, base
);
1003 /****** intelpro100.device/NSCMD_DEVICEQUERY *******************************
1006 * NSCMD_DEVICEQUERY -- Query device capabilities.
1009 * See New-style Device documentation.
1011 ****************************************************************************
1013 * Note that we have to pretend the request structure is an IOStdReq.
1017 static BOOL
CmdDeviceQuery(struct IOStdReq
*request
,
1018 struct DevBase
*base
)
1020 struct NSDeviceQueryResult
*info
;
1022 /* Set structure size twice */
1024 info
= request
->io_Data
;
1025 request
->io_Actual
= info
->SizeAvailable
=
1026 (ULONG
)OFFSET(NSDeviceQueryResult
, SupportedCommands
) + sizeof(APTR
);
1028 /* Report device details */
1030 info
->DeviceType
= NSDEVTYPE_SANA2
;
1031 info
->DeviceSubType
= 0;
1033 info
->SupportedCommands
= (APTR
)supported_commands
;
1042 /****** intelpro100.device/S2_ADDMULTICASTADDRESS **************************
1045 * S2_ADDMULTICASTADDRESS
1048 * See SANA-II documentation.
1050 ****************************************************************************
1054 /****** intelpro100.device/S2_ADDMULTICASTADDRESSES ************************
1057 * S2_ADDMULTICASTADDRESSES
1060 * See SANA-II documentation.
1062 ****************************************************************************
1066 static BOOL
CmdAddMulticastAddresses(struct IOSana2Req
*request
,
1067 struct DevBase
*base
)
1069 struct DevUnit
*unit
;
1072 BOOL complete
= FALSE
;
1073 UBYTE
*lower_bound
, *upper_bound
;
1075 unit
= (APTR
)request
->ios2_Req
.io_Unit
;
1077 lower_bound
= request
->ios2_SrcAddr
;
1078 if(request
->ios2_Req
.io_Command
== S2_ADDMULTICASTADDRESS
)
1079 upper_bound
= lower_bound
;
1081 upper_bound
= request
->ios2_DstAddr
;
1083 if(!AddMulticastRange(unit
, lower_bound
, upper_bound
, base
))
1085 error
= S2ERR_NO_RESOURCES
;
1086 wire_error
= S2WERR_GENERIC_ERROR
;
1089 /* Update hardware filter if unit is online */
1091 if(error
== 0 && (unit
->flags
& UNITF_ONLINE
) != 0
1092 && (unit
->flags
& UNITF_PROM
) == 0)
1094 PutRequest(unit
->request_ports
[WRITE_QUEUE
], (APTR
)request
, base
);
1098 request
->ios2_Req
.io_Error
= error
;
1099 request
->ios2_WireError
= wire_error
;
1110 /****** intelpro100.device/S2_DELMULTICASTADDRESS **************************
1113 * S2_DELMULTICASTADDRESS
1116 * See SANA-II documentation.
1118 ****************************************************************************
1122 /****** intelpro100.device/S2_DELMULTICASTADDRESSES ************************
1125 * S2_DELMULTICASTADDRESSES
1128 * See SANA-II documentation.
1130 ****************************************************************************
1134 static BOOL
CmdDelMulticastAddresses(struct IOSana2Req
*request
,
1135 struct DevBase
*base
)
1137 struct DevUnit
*unit
;
1140 BOOL complete
= FALSE
;
1141 UBYTE
*lower_bound
, *upper_bound
;
1143 unit
= (APTR
)request
->ios2_Req
.io_Unit
;
1145 lower_bound
= request
->ios2_SrcAddr
;
1146 if(request
->ios2_Req
.io_Command
== S2_DELMULTICASTADDRESS
)
1147 upper_bound
= lower_bound
;
1149 upper_bound
= request
->ios2_DstAddr
;
1151 if(!RemMulticastRange(unit
, lower_bound
, upper_bound
, base
))
1153 error
= S2ERR_BAD_STATE
;
1154 wire_error
= S2WERR_BAD_MULTICAST
;
1157 /* Update hardware filter if unit is online */
1159 if(error
== 0 && (unit
->flags
& UNITF_ONLINE
) != 0
1160 && (unit
->flags
& UNITF_PROM
) == 0)
1162 PutRequest(unit
->request_ports
[WRITE_QUEUE
], (APTR
)request
, base
);
1166 request
->ios2_Req
.io_Error
= error
;
1167 request
->ios2_WireError
= wire_error
;
1178 /****i* intelpro100.device/PutRequest **************************************
1184 * PutRequest(port, request)
1186 * VOID PutRequest(struct MsgPort *, struct IORequest *);
1188 ****************************************************************************
1192 VOID
PutRequest(struct MsgPort
*port
, struct IORequest
*request
,
1193 struct DevBase
*base
)
1195 request
->io_Flags
&= ~IOF_QUICK
;
1196 PutMsg(port
, (APTR
)request
);