|
|
1.1 ! root 1: /* ! 2: * Copyright (c) 1998-2000 Apple Computer, Inc. All rights reserved. ! 3: * ! 4: * @APPLE_LICENSE_HEADER_START@ ! 5: * ! 6: * The contents of this file constitute Original Code as defined in and ! 7: * are subject to the Apple Public Source License Version 1.1 (the ! 8: * "License"). You may not use this file except in compliance with the ! 9: * License. Please obtain a copy of the License at ! 10: * http://www.apple.com/publicsource and read it before using this file. ! 11: * ! 12: * This Original Code and all software distributed under the License are ! 13: * distributed on an "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, EITHER ! 14: * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, ! 15: * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, ! 16: * FITNESS FOR A PARTICULAR PURPOSE OR NON-INFRINGEMENT. Please see the ! 17: * License for the specific language governing rights and limitations ! 18: * under the License. ! 19: * ! 20: * @APPLE_LICENSE_HEADER_END@ ! 21: */ ! 22: /* ! 23: * Copyright (c) 1999 Apple Computer, Inc. All rights reserved. ! 24: * ! 25: * IOMBufMemoryCursor.h created by gvdl on 1999-1-20 ! 26: * ! 27: */ ! 28: ! 29: #ifndef _IOKIT_NETWORK_IOMBUFMEMORYCURSOR_H ! 30: #define _IOKIT_NETWORK_IOMBUFMEMORYCURSOR_H ! 31: ! 32: #include <IOKit/IOMemoryCursor.h> ! 33: ! 34: struct mbuf; ! 35: ! 36: /*! @class IOMBufMemoryCursor : public IOMemoryCursor ! 37: @abstract A mechanism to convert mbuf chains to physical addresses. ! 38: @discussion The IOMBufMemoryCursor defines the super class that all ! 39: specific mbuf cursors must inherit from, but a mbuf cursor can be created ! 40: without a specific formal subclass by just providing a segment function to ! 41: the initializers. This class performs the task of walking a given ! 42: mbuf chain and creating a physical scatter/gather list appropriate for ! 43: the target hardware. When necessary, this class may also coalesce ! 44: mbuf chains when the generated scatter/gather list exceeds the specified ! 45: hardware limit. However, this should be avoided since it exacts a ! 46: performance cost. ! 47: <br><br> ! 48: A driver is expected to create a mbuf cursor and configure it to match the ! 49: limitations of it's DMA hardware; for instance the mbuf cursor used by ! 50: an Ethernet controller driver may have a maximum physical segment size ! 51: of 1520, and allow for up to 6 physical segments. Thus it would create a ! 52: mbuf cursor with a maxSegmentSize of 1520 and a maxNumSegments of 6. ! 53: The driver may choose to supply an OutputSegmentFunc function to ! 54: format the output of each scatter/gather segment to match the ! 55: hardware descriptor format, or it may use a subclass of ! 56: IOMBufMemoryCursor to generate IOPhysicalSegment segments with ! 57: various byte orders. ! 58: <br><br> ! 59: A driver may also create more than one mbuf cursor, perhaps one ! 60: dedicated for the transmit thread, and the other for the receive thread. ! 61: This becomes a requirement when the driver is multi-threaded, since the ! 62: mbuf cursor maintains state and does not support reentrancy. */ ! 63: ! 64: class IOMBufMemoryCursor : public IOMemoryCursor ! 65: { ! 66: OSDeclareAbstractStructors(IOMBufMemoryCursor) ! 67: ! 68: private: ! 69: virtual bool initWithSpecification(OutputSegmentFunc outSeg, ! 70: UInt maxSegmentSize, ! 71: UInt maxTransferSize, ! 72: UInt align); ! 73: ! 74: protected: ! 75: UInt maxNumSegments; ! 76: UInt coalesceCount; ! 77: UInt packetTooBigErrors; ! 78: ! 79: /*! @function initWithSpecification ! 80: @abstract Primary initializer for the IOMBufMemoryCursor class. ! 81: @param outSeg Function to call to output one physical segment. ! 82: @param maxSegmentSize Maximum allowable size for one segment. ! 83: @param maxNumSegments Maximum number of segments. ! 84: @result true if the inherited classes and this instance initialized ! 85: successfully. */ ! 86: ! 87: virtual bool initWithSpecification(OutputSegmentFunc outSeg, ! 88: UInt maxSegmentSize, ! 89: UInt maxNumSegments); ! 90: ! 91: /*! @function genPhysicalSegments ! 92: @abstract Generate a physical scatter/gather list given a mbuf packet. ! 93: @discussion Generates a list of physical segments from the given mbuf. ! 94: @param packet The mbuf packet. ! 95: @param vector Void pointer to base of output physical scatter/gather list. ! 96: Always passed directly onto the OutputSegmentFunc without interpretation ! 97: by the cursor. ! 98: @param maxSegs Maximum number of segments that can be written to segments ! 99: array. ! 100: @param doCoalesce Set to true to perform coalescing when the required ! 101: number of segments exceeds the specified limit, otherwise abort and ! 102: return 0. ! 103: @result The number of segments that were filled in is returned, or ! 104: 0 if an error occurred. */ ! 105: ! 106: virtual UInt genPhysicalSegments(struct mbuf * packet, void * vector, ! 107: UInt maxSegs, bool doCoalesce); ! 108: ! 109: public: ! 110: ! 111: /*! @function genPhysicalSegments ! 112: @abstract Returns a count of the total number of mbuf chains coalesced ! 113: by genPhysicalSegments(). The counter is then reset to 0. ! 114: @result The coalesce count. */ ! 115: ! 116: UInt getAndResetCoalesceCount(); ! 117: }; ! 118: ! 119: ! 120: /*! @class IOMBufNaturalMemoryCursor : public IOMBufMemoryCursor ! 121: @abstract A IOMBufMemoryCursor subclass that outputs a vector of ! 122: IOPhysicalSegments in the natural byte orientation for the cpu. ! 123: @discussion The IOMBufNaturalMemoryCursor would be used when it is too ! 124: difficult to implement an OutputSegmentFunc that is more appropriate for ! 125: your hardware. This cursor just outputs an array of IOPhysicalSegments. */ ! 126: ! 127: class IOMBufNaturalMemoryCursor : public IOMBufMemoryCursor ! 128: { ! 129: OSDeclareDefaultStructors(IOMBufNaturalMemoryCursor) ! 130: ! 131: public: ! 132: ! 133: /*! @function withSpecification ! 134: @abstract Factory function to create and initialize an ! 135: IOMBufNaturalMemoryCursor in one operation, see ! 136: IOMBufMemoryCursor::initWithSpecification. ! 137: @param maxSegmentSize Maximum allowable size for one segment. ! 138: @param maxNumSegments Maximum number of segments. ! 139: @result A new mbuf cursor if successfully created and initialized, ! 140: 0 otherwise. */ ! 141: ! 142: static IOMBufNaturalMemoryCursor * withSpecification(UInt maxSegmentSize, ! 143: UInt maxNumSegments); ! 144: ! 145: /*! @function getPhysicalSegments ! 146: @abstract Generate a cpu natural physical scatter/gather list from a given ! 147: mbuf. ! 148: @param packet The mbuf packet. ! 149: @param vector Pointer to an array of IOPhysicalSegments for the output ! 150: physical scatter/gather list. ! 151: @param numVectorSegments Maximum number of IOPhysicalSegments accepted. ! 152: @result The number of segments that were filled in is returned, or ! 153: 0 if an error occurred. */ ! 154: ! 155: UInt getPhysicalSegments(struct mbuf * packet, ! 156: struct IOPhysicalSegment * vector, ! 157: UInt numVectorSegments = 0); ! 158: ! 159: /*! @function getPhysicalSegmentsWithCoalesce ! 160: @abstract Generate a cpu natural physical scatter/gather list from a given ! 161: mbuf. ! 162: @discussion Generate a cpu natural physical scatter/gather list from a ! 163: given mbuf. Coalesce mbuf chain when the number of segments in the ! 164: scatter/gather list exceeds numVectorSegments. ! 165: @param packet The mbuf packet. ! 166: @param vector Pointer to an array of IOPhysicalSegments for the output ! 167: physical scatter/gather list. ! 168: @param numVectorSegments Maximum number of IOPhysicalSegments accepted. ! 169: @result The number of segments that were filled in is returned, or ! 170: 0 if an error occurred. */ ! 171: ! 172: UInt getPhysicalSegmentsWithCoalesce(struct mbuf * packet, ! 173: struct IOPhysicalSegment * vector, ! 174: UInt numVectorSegments = 0); ! 175: }; ! 176: ! 177: //=========================================================================== ! 178: //=========================================================================== ! 179: ! 180: /*! @class IOMBufBigMemoryCursor : public IOMBufMemoryCursor ! 181: @abstract A IOMBufMemoryCursor subclass that outputs a vector of ! 182: IOPhysicalSegments in the big endian byte order. ! 183: @discussion The IOMBufBigMemoryCursor would be used when the DMA hardware ! 184: requires a big endian address and length pair. This cursor outputs an ! 185: array of IOPhysicalSegments that are encoded in big-endian format. */ ! 186: ! 187: class IOMBufBigMemoryCursor : public IOMBufMemoryCursor ! 188: { ! 189: OSDeclareDefaultStructors(IOMBufBigMemoryCursor) ! 190: ! 191: public: ! 192: ! 193: /*! @function withSpecification ! 194: @abstract Factory function to create and initialize an ! 195: IOMBufBigMemoryCursor in one operation, see ! 196: IOMBufMemoryCursor::initWithSpecification. ! 197: @param maxSegmentSize Maximum allowable size for one segment. ! 198: @param maxNumSegments Maximum number of segments. ! 199: @result A new mbuf cursor if successfully created and initialized, ! 200: 0 otherwise. */ ! 201: ! 202: static IOMBufBigMemoryCursor * withSpecification(UInt maxSegmentSize, ! 203: UInt maxNumSegments); ! 204: ! 205: /*! @function getPhysicalSegments ! 206: @abstract Generate a big endian physical scatter/gather list from a given ! 207: mbuf. ! 208: @param packet The mbuf packet. ! 209: @param vector Pointer to an array of IOPhysicalSegments for the output ! 210: physical scatter/gather list. ! 211: @param numVectorSegments Maximum number of IOPhysicalSegments accepted. ! 212: @result The number of segments that were filled in is returned, or ! 213: 0 if an error occurred. */ ! 214: ! 215: UInt getPhysicalSegments(struct mbuf * packet, ! 216: struct IOPhysicalSegment * vector, ! 217: UInt numVectorSegments = 0); ! 218: ! 219: /*! @function getPhysicalSegmentsWithCoalesce ! 220: @abstract Generate a big endian physical scatter/gather list from a given ! 221: mbuf. ! 222: @discussion Generate a big endian physical scatter/gather list from a ! 223: given mbuf. Coalesce mbuf chain when the number of segments in the ! 224: scatter/gather list exceeds numVectorSegments. ! 225: @param packet The mbuf packet. ! 226: @param vector Pointer to an array of IOPhysicalSegments for the output ! 227: physical scatter/gather list. ! 228: @param numVectorSegments Maximum number of IOPhysicalSegments accepted. ! 229: @result The number of segments that were filled in is returned, or ! 230: 0 if an error occurred. */ ! 231: ! 232: UInt getPhysicalSegmentsWithCoalesce(struct mbuf * packet, ! 233: struct IOPhysicalSegment * vector, ! 234: UInt numVectorSegments = 0); ! 235: }; ! 236: ! 237: //=========================================================================== ! 238: //=========================================================================== ! 239: ! 240: /*! @class IOMBufLittleMemoryCursor : public IOMBufMemoryCursor ! 241: @abstract A IOMBufMemoryCursor subclass that outputs a vector of ! 242: IOPhysicalSegments in the little endian byte order. ! 243: @discussion The IOMBufLittleMemoryCursor would be used when the DMA ! 244: hardware requires a little endian address and length pair. This cursor ! 245: outputs an array of IOPhysicalSegments that are encoded in little endian ! 246: format. */ ! 247: ! 248: class IOMBufLittleMemoryCursor : public IOMBufMemoryCursor ! 249: { ! 250: OSDeclareDefaultStructors(IOMBufLittleMemoryCursor) ! 251: ! 252: public: ! 253: ! 254: /*! @function withSpecification ! 255: @abstract Factory function to create and initialize an ! 256: IOMBufLittleMemoryCursor in one operation, see ! 257: IOMBufMemoryCursor::initWithSpecification. ! 258: @param maxSegmentSize Maximum allowable size for one segment. ! 259: @param maxNumSegments Maximum number of segments. ! 260: @result A new mbuf cursor if successfully created and initialized, ! 261: 0 otherwise. */ ! 262: ! 263: static IOMBufLittleMemoryCursor * withSpecification(UInt maxSegmentSize, ! 264: UInt maxNumSegments); ! 265: ! 266: /*! @function getPhysicalSegments ! 267: @abstract Generate a little endian physical scatter/gather list from a ! 268: given mbuf. ! 269: @param packet The mbuf packet. ! 270: @param vector Pointer to an array of IOPhysicalSegments for the output ! 271: physical scatter/gather list. ! 272: @param numVectorSegments Maximum number of IOPhysicalSegments accepted. ! 273: @result The number of segments that were filled in is returned, or ! 274: 0 if an error occurred. */ ! 275: ! 276: UInt getPhysicalSegments(struct mbuf * packet, ! 277: struct IOPhysicalSegment * vector, ! 278: UInt numVectorSegments = 0); ! 279: ! 280: /*! @function getPhysicalSegmentsWithCoalesce ! 281: @abstract Generate a little endian physical scatter/gather list from a ! 282: given mbuf. ! 283: @discussion Generate a little endian physical scatter/gather list from a ! 284: given mbuf. Coalesce mbuf chain when the number of segments in the ! 285: scatter/gather list exceeds numVectorSegments. ! 286: @param packet The mbuf packet. ! 287: @param vector Pointer to an array of IOPhysicalSegments for the output ! 288: physical scatter/gather list. ! 289: @param numVectorSegments Maximum number of IOPhysicalSegments accepted. ! 290: @result The number of segments that were filled in is returned, or ! 291: 0 if an error occurred. */ ! 292: ! 293: UInt getPhysicalSegmentsWithCoalesce(struct mbuf * packet, ! 294: struct IOPhysicalSegment * vector, ! 295: UInt numVectorSegments = 0); ! 296: }; ! 297: ! 298: #ifdef __ppc__ ! 299: ! 300: struct IODBDMADescriptor; ! 301: ! 302: //=========================================================================== ! 303: //=========================================================================== ! 304: ! 305: /*! @class IOMBufDBDMAMemoryCursor : public IOMBufMemoryCursor ! 306: @abstract A IOMBufMemoryCursor subclass that outputs a vector of ! 307: IODBDMADescriptors. */ ! 308: ! 309: class IOMBufDBDMAMemoryCursor : public IOMBufMemoryCursor ! 310: { ! 311: OSDeclareDefaultStructors(IOMBufDBDMAMemoryCursor) ! 312: ! 313: public: ! 314: ! 315: /*! @function withSpecification ! 316: @abstract Factory function to create and initialize an ! 317: IOMBufDBDMAMemoryCursor in one operation, see ! 318: IOMBufMemoryCursor::initWithSpecification. ! 319: @param maxSegmentSize Maximum allowable size for one segment. ! 320: @param maxNumSegments Maximum number of segments. ! 321: @result A new mbuf cursor if successfully created and initialized, ! 322: 0 otherwise. */ ! 323: ! 324: static IOMBufDBDMAMemoryCursor * withSpecification(UInt maxSegmentSize, ! 325: UInt maxNumSegments); ! 326: ! 327: /*! @function getPhysicalSegments ! 328: @abstract Generate a DBDMA descriptor list from a given mbuf. ! 329: @param packet The mbuf packet. ! 330: @param vector Pointer to an array of IODBDMADescriptor for the output list. ! 331: @param numVectorSegments Maximum number of IODBDMADescriptors accepted. ! 332: @result The number of segments that were filled in is returned, or ! 333: 0 if an error occurred. */ ! 334: ! 335: UInt getPhysicalSegments(struct mbuf * packet, ! 336: struct IODBDMADescriptor *vector, ! 337: UInt numVectorSegments = 0); ! 338: ! 339: /*! @function getPhysicalSegmentsWithCoalesce ! 340: @abstract Generate a DBDMA descriptor list from a given mbuf. ! 341: @discussion Generate a DBDMA descriptor list from a given mbuf. ! 342: Coalesce mbuf chain when the number of elements in the list exceeds ! 343: numVectorSegments. ! 344: @param packet The mbuf packet. ! 345: @param vector Pointer to an array of IODBDMADescriptor for the output list. ! 346: @param numVectorSegments Maximum number of IODBDMADescriptors accepted. ! 347: @result The number of segments that were filled in is returned, or ! 348: 0 if an error occurred. */ ! 349: ! 350: UInt getPhysicalSegmentsWithCoalesce(struct mbuf * packet, ! 351: struct IODBDMADescriptor * vector, ! 352: UInt numVectorSegments = 0); ! 353: }; ! 354: ! 355: #endif /* __ppc__ */ ! 356: ! 357: inline UInt IOMBufMemoryCursor::getAndResetCoalesceCount() ! 358: { ! 359: UInt cnt = coalesceCount; coalesceCount = 0; return cnt; ! 360: } ! 361: ! 362: inline UInt ! 363: IOMBufNaturalMemoryCursor::getPhysicalSegments(struct mbuf *packet, ! 364: struct IOPhysicalSegment *vector, ! 365: UInt numVectorSegments = 0) ! 366: { ! 367: return genPhysicalSegments(packet, vector, numVectorSegments, false); ! 368: } ! 369: ! 370: inline UInt ! 371: IOMBufNaturalMemoryCursor::getPhysicalSegmentsWithCoalesce(struct mbuf *packet, ! 372: struct IOPhysicalSegment *vector, ! 373: UInt numVectorSegments = 0) ! 374: { ! 375: return genPhysicalSegments(packet, vector, numVectorSegments, true); ! 376: } ! 377: ! 378: inline UInt ! 379: IOMBufBigMemoryCursor::getPhysicalSegments(struct mbuf *packet, ! 380: struct IOPhysicalSegment *vector, ! 381: UInt numVectorSegments = 0) ! 382: { ! 383: return genPhysicalSegments(packet, vector, numVectorSegments, false); ! 384: } ! 385: ! 386: inline UInt ! 387: IOMBufBigMemoryCursor::getPhysicalSegmentsWithCoalesce(struct mbuf *packet, ! 388: struct IOPhysicalSegment *vector, ! 389: UInt numVectorSegments = 0) ! 390: { ! 391: return genPhysicalSegments(packet, vector, numVectorSegments, true); ! 392: } ! 393: ! 394: inline UInt ! 395: IOMBufLittleMemoryCursor::getPhysicalSegments(struct mbuf *packet, ! 396: struct IOPhysicalSegment *vector, ! 397: UInt numVectorSegments = 0) ! 398: { ! 399: return genPhysicalSegments(packet, vector, numVectorSegments, false); ! 400: } ! 401: ! 402: inline UInt ! 403: IOMBufLittleMemoryCursor::getPhysicalSegmentsWithCoalesce(struct mbuf *packet, ! 404: struct IOPhysicalSegment *vector, ! 405: UInt numVectorSegments = 0) ! 406: { ! 407: return genPhysicalSegments(packet, vector, numVectorSegments, true); ! 408: } ! 409: ! 410: #ifdef __ppc__ ! 411: inline UInt ! 412: IOMBufDBDMAMemoryCursor::getPhysicalSegments(struct mbuf *packet, ! 413: struct IODBDMADescriptor *vector, ! 414: UInt numVectorSegments = 0) ! 415: { ! 416: return genPhysicalSegments(packet, vector, numVectorSegments, false); ! 417: } ! 418: ! 419: inline UInt ! 420: IOMBufDBDMAMemoryCursor::getPhysicalSegmentsWithCoalesce(struct mbuf *packet, ! 421: struct IODBDMADescriptor *vector, ! 422: UInt numVectorSegments = 0) ! 423: { ! 424: return genPhysicalSegments(packet, vector, numVectorSegments, true); ! 425: } ! 426: #endif /* __ppc__ */ ! 427: ! 428: #endif /* !_IOKIT_NETWORK_IOMBUFMEMORYCURSOR_H */ ! 429:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.