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,
24 #include <exec/types.h>
25 #include <exec/errors.h>
26 #include <exec/initializers.h>
27 #include <devices/newstyle.h>
29 #include <proto/exec.h>
30 #include <proto/utility.h>
34 #include "request_protos.h"
35 #include "unit_protos.h"
38 #define KNOWN_EVENTS \
39 (S2EVENT_ERROR | S2EVENT_TX | S2EVENT_RX | S2EVENT_ONLINE \
40 | S2EVENT_OFFLINE | S2EVENT_BUFF | S2EVENT_HARDWARE | S2EVENT_SOFTWARE)
43 static BOOL
CmdInvalid(struct IOSana2Req
*request
, struct DevBase
*base
);
44 static BOOL
CmdRead(struct IOSana2Req
*request
, struct DevBase
*base
);
45 static BOOL
CmdWrite(struct IOSana2Req
*request
, struct DevBase
*base
);
46 static BOOL
CmdFlush(struct IORequest
*request
, struct DevBase
*base
);
47 static BOOL
CmdS2DeviceQuery(struct IOSana2Req
*request
,
48 struct DevBase
*base
);
49 static BOOL
CmdGetStationAddress(struct IOSana2Req
*request
,
50 struct DevBase
*base
);
51 static BOOL
CmdConfigInterface(struct IOSana2Req
*request
,
52 struct DevBase
*base
);
53 static BOOL
CmdBroadcast(struct IOSana2Req
*request
,
54 struct DevBase
*base
);
55 static BOOL
CmdTrackType(struct IOSana2Req
*request
,
56 struct DevBase
*base
);
57 static BOOL
CmdUntrackType(struct IOSana2Req
*request
,
58 struct DevBase
*base
);
59 static BOOL
CmdGetTypeStats(struct IOSana2Req
*request
,
60 struct DevBase
*base
);
61 static BOOL
CmdGetSpecialStats(struct IOSana2Req
*request
,
62 struct DevBase
*base
);
63 static BOOL
CmdGetGlobalStats(struct IOSana2Req
*request
,
64 struct DevBase
*base
);
65 static BOOL
CmdOnEvent(struct IOSana2Req
*request
, struct DevBase
*base
);
66 static BOOL
CmdReadOrphan(struct IOSana2Req
*request
,
67 struct DevBase
*base
);
68 static BOOL
CmdOnline(struct IOSana2Req
*request
, struct DevBase
*base
);
69 static BOOL
CmdOffline(struct IOSana2Req
*request
, struct DevBase
*base
);
70 static BOOL
CmdDeviceQuery(struct IOStdReq
*request
,
71 struct DevBase
*base
);
72 static BOOL
CmdAddMulticastAddresses(struct IOSana2Req
*request
,
73 struct DevBase
*base
);
74 static BOOL
CmdDelMulticastAddresses(struct IOSana2Req
*request
,
75 struct DevBase
*base
);
78 static const UWORD supported_commands
[] =
86 S2_ADDMULTICASTADDRESS
,
87 S2_DELMULTICASTADDRESS
,
100 S2_ADDMULTICASTADDRESSES
,
101 S2_DELMULTICASTADDRESSES
,
105 static const struct Sana2DeviceQuery sana2_info
=
117 const TEXT badmulticast_name
[] = "Bad multicasts";
118 const TEXT retries_name
[] = "Retries";
119 const TEXT fifo_underruns_name
[] = "Underruns";
121 const TEXT
*const special_stat_names
[] =
130 /****i* intelpro100.device/ServiceRequest **********************************
133 * ServiceRequest -- Attempt to service a device request.
136 * ServiceRequest(request)
138 * VOID ServiceRequest(struct IORequest *);
141 * Attempts to carry out a request. The relevant unit's semaphore must
142 * be obtained before calling this function. This function releases the
143 * semaphore before returning.
146 * request - The request to service.
151 ****************************************************************************
155 VOID
ServiceRequest(struct IOSana2Req
*request
, struct DevBase
*base
)
159 switch(request
->ios2_Req
.io_Command
)
162 complete
= CmdRead(request
, base
);
165 complete
= CmdWrite(request
, base
);
168 complete
= CmdFlush((APTR
)request
, base
);
171 complete
= CmdS2DeviceQuery((APTR
)request
, base
);
173 case S2_GETSTATIONADDRESS
:
174 complete
= CmdGetStationAddress((APTR
)request
, base
);
176 case S2_CONFIGINTERFACE
:
177 complete
= CmdConfigInterface((APTR
)request
, base
);
179 case S2_ADDMULTICASTADDRESS
:
180 complete
= CmdAddMulticastAddresses((APTR
)request
, base
);
182 case S2_DELMULTICASTADDRESS
:
183 complete
= CmdDelMulticastAddresses((APTR
)request
, base
);
186 complete
= CmdWrite((APTR
)request
, base
);
189 complete
= CmdBroadcast((APTR
)request
, base
);
192 complete
= CmdTrackType((APTR
)request
, base
);
195 complete
= CmdUntrackType((APTR
)request
, base
);
197 case S2_GETTYPESTATS
:
198 complete
= CmdGetTypeStats((APTR
)request
, base
);
200 case S2_GETSPECIALSTATS
:
201 complete
= CmdGetSpecialStats((APTR
)request
, base
);
203 case S2_GETGLOBALSTATS
:
204 complete
= CmdGetGlobalStats((APTR
)request
, base
);
207 complete
= CmdOnEvent((APTR
)request
, base
);
210 complete
= CmdReadOrphan((APTR
)request
, base
);
213 complete
= CmdOnline((APTR
)request
, base
);
216 complete
= CmdOffline((APTR
)request
, base
);
218 case NSCMD_DEVICEQUERY
:
219 complete
= CmdDeviceQuery((APTR
)request
, base
);
221 case S2_ADDMULTICASTADDRESSES
:
222 complete
= CmdAddMulticastAddresses((APTR
)request
, base
);
224 case S2_DELMULTICASTADDRESSES
:
225 complete
= CmdDelMulticastAddresses((APTR
)request
, base
);
228 complete
= CmdInvalid((APTR
)request
, base
);
231 if(complete
&& ((request
->ios2_Req
.io_Flags
& IOF_QUICK
) == 0))
232 ReplyMsg((APTR
)request
);
234 ReleaseSemaphore(&((struct DevUnit
*)request
->ios2_Req
.io_Unit
)->
241 /****i* intelpro100.device/CMD_INVALID *************************************
244 * CMD_INVALID -- Reject invalid commands.
247 * See SANA-II documentation.
249 ****************************************************************************
253 static BOOL
CmdInvalid(struct IOSana2Req
*request
, struct DevBase
*base
)
255 request
->ios2_Req
.io_Error
= IOERR_NOCMD
;
256 request
->ios2_WireError
= S2WERR_GENERIC_ERROR
;
263 /****** intelpro100.device/CMD_READ ****************************************
266 * CMD_READ -- Read data.
269 * See SANA-II documentation.
271 ****************************************************************************
275 static BOOL
CmdRead(struct IOSana2Req
*request
, struct DevBase
*base
)
277 struct DevUnit
*unit
;
278 struct Opener
*opener
;
279 BOOL complete
= FALSE
;
281 unit
= (APTR
)request
->ios2_Req
.io_Unit
;
283 if((unit
->flags
& UNITF_ONLINE
) != 0)
285 opener
= request
->ios2_BufferManagement
;
286 PutRequest(&opener
->read_port
, (APTR
)request
, base
);
290 request
->ios2_Req
.io_Error
= S2ERR_OUTOFSERVICE
;
291 request
->ios2_WireError
= S2WERR_UNIT_OFFLINE
;
302 /****** intelpro100.device/CMD_WRITE ***************************************
305 * CMD_WRITE -- Write data.
308 * See SANA-II documentation.
310 ****************************************************************************
314 /****** intelpro100.device/S2_MULTICAST ************************************
320 * See SANA-II documentation.
322 ****************************************************************************
326 static BOOL
CmdWrite(struct IOSana2Req
*request
, struct DevBase
*base
)
328 struct DevUnit
*unit
;
331 BOOL complete
= FALSE
;
333 /* Check request is valid */
335 unit
= (APTR
)request
->ios2_Req
.io_Unit
;
336 if((unit
->flags
& UNITF_ONLINE
) == 0)
338 error
= S2ERR_OUTOFSERVICE
;
339 wire_error
= S2WERR_UNIT_OFFLINE
;
341 else if((request
->ios2_Req
.io_Command
== S2_MULTICAST
) &&
342 ((request
->ios2_DstAddr
[0] & 0x1) == 0))
344 error
= S2ERR_BAD_ADDRESS
;
345 wire_error
= S2WERR_BAD_MULTICAST
;
348 /* Queue request for sending */
351 PutRequest(unit
->request_ports
[WRITE_QUEUE
], (APTR
)request
, base
);
354 request
->ios2_Req
.io_Error
= error
;
355 request
->ios2_WireError
= wire_error
;
366 /****** intelpro100.device/CMD_FLUSH ***************************************
372 * See SANA-II documentation.
374 ****************************************************************************
378 static BOOL
CmdFlush(struct IORequest
*request
, struct DevBase
*base
)
380 FlushUnit((APTR
)request
->io_Unit
, EVENT_QUEUE
, IOERR_ABORTED
, base
);
387 /****** intelpro100.device/S2_DEVICEQUERY **********************************
390 * S2_DEVICEQUERY -- Query device capabilities.
393 * See SANA-II documentation.
395 ****************************************************************************
399 static BOOL
CmdS2DeviceQuery(struct IOSana2Req
*request
,
400 struct DevBase
*base
)
402 struct DevUnit
*unit
;
403 struct Sana2DeviceQuery
*info
;
404 ULONG size_available
, size
;
406 /* Copy device info */
408 unit
= (APTR
)request
->ios2_Req
.io_Unit
;
409 info
= request
->ios2_StatData
;
410 size
= size_available
= info
->SizeAvailable
;
411 if(size
> sizeof(struct Sana2DeviceQuery
))
412 size
= sizeof(struct Sana2DeviceQuery
);
414 CopyMem(&sana2_info
, info
, size
);
415 info
->BPS
= unit
->speed
;
417 info
->SizeAvailable
= size_available
;
418 info
->SizeSupplied
= size
;
427 /****** intelpro100.device/S2_GETSTATIONADDDRESS ***************************
430 * S2_GETSTATIONADDDRESS
433 * See SANA-II documentation.
435 ****************************************************************************
439 static BOOL
CmdGetStationAddress(struct IOSana2Req
*request
,
440 struct DevBase
*base
)
442 struct DevUnit
*unit
;
446 unit
= (APTR
)request
->ios2_Req
.io_Unit
;
447 CopyMem(unit
->address
, request
->ios2_SrcAddr
, ETH_ADDRESSSIZE
);
448 CopyMem(unit
->default_address
, request
->ios2_DstAddr
, ETH_ADDRESSSIZE
);
457 /****** intelpro100.device/S2_CONFIGINTERFACE ******************************
460 * S2_CONFIGINTERFACE --
463 * See SANA-II documentation.
465 ****************************************************************************
469 static BOOL
CmdConfigInterface(struct IOSana2Req
*request
,
470 struct DevBase
*base
)
472 struct DevUnit
*unit
;
474 /* Configure adapter */
476 unit
= (APTR
)request
->ios2_Req
.io_Unit
;
477 if((unit
->flags
& UNITF_CONFIGURED
) == 0)
479 CopyMem(request
->ios2_SrcAddr
, unit
->address
, ETH_ADDRESSSIZE
);
480 if((unit
->flags
& UNITF_HAVEADAPTER
) != 0)
481 ConfigureAdapter(unit
, base
);
482 unit
->flags
|= UNITF_CONFIGURED
;
486 request
->ios2_Req
.io_Error
= S2ERR_BAD_STATE
;
487 request
->ios2_WireError
= S2WERR_IS_CONFIGURED
;
497 /****** intelpro100.device/S2_BROADCAST ************************************
503 * See SANA-II documentation.
505 ****************************************************************************
509 static BOOL
CmdBroadcast(struct IOSana2Req
*request
,
510 struct DevBase
*base
)
512 /* Fill in the broadcast address as destination */
514 memset(request
->ios2_DstAddr
, 0xff, 6);
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
);